зеркало из https://github.com/softlandia/alg.git
add README.md, 1.log
This commit is contained in:
Родитель
d0c3d30d55
Коммит
b89779f162
|
@ -0,0 +1,204 @@
|
|||
[ AutoCAD - Mon Oct 01 18:54:07 2018 ]----------------------------------------
|
||||
Regenerating model.
|
||||
|
||||
|
||||
AutoCAD menu utilities loaded.*Cancel*
|
||||
|
||||
Command:
|
||||
Command:
|
||||
|
||||
Command:
|
||||
Command: Specify opposite corner or [Fence/WPolygon/CPolygon]:
|
||||
Command: LIST
|
||||
12 found
|
||||
|
||||
LWPOLYLINE Layer: "ÑÅÉÑÌÈÊÀ ëèíèè"
|
||||
Space: Model space
|
||||
Handle = bc6c
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3265.4336
|
||||
|
||||
at point X=6382.5472 Y=2544.4529 Z= 0.0000
|
||||
at point X=9060.8673 Y= 676.3903 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÍÀÐÓØÅÍÈß"
|
||||
Space: Model space
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc6b
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3317.6669
|
||||
|
||||
at point X=6098.5189 Y=2318.9708 Z= 0.0000
|
||||
at point X=8862.3874 Y= 483.7746 Z= 0.0000
|
||||
Press ENTER to continue:
|
||||
|
||||
LWPOLYLINE Layer: "!ËÓ"
|
||||
Space: Model space
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc6a
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3396.1871
|
||||
|
||||
at point X=5881.3578 Y=2187.4155 Z= 0.0000
|
||||
at point X=8717.6134 Y= 319.3305 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÈÇÎËÈÍÈÈ"
|
||||
Space: Model space
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc69
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3489.3683
|
||||
|
||||
at point X=5697.0999 Y=2075.5935 Z= 0.0000
|
||||
at point X=8618.9038 Y= 168.0419 Z= 0.0000
|
||||
Press ENTER to continue:
|
||||
|
||||
LWPOLYLINE Layer: "ÃÍÊ ïðåäûäóùèé"
|
||||
Space: Model space
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc68
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3317.6669
|
||||
|
||||
at point X=5565.4871 Y=1865.1050 Z= 0.0000
|
||||
at point X=8329.3556 Y= 29.9088 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÃÂÊ"
|
||||
Space: Model space
|
||||
Color: BYLAYER Linetype: "_GWCint_"
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc67
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3396.1871
|
||||
|
||||
at point X=5348.3260 Y=1733.5498 Z= 0.0000
|
||||
Press ENTER to continue:
|
||||
at point X=8184.5815 Y=-134.5353 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÃÂÊ"
|
||||
Space: Model space
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc66
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3489.3683
|
||||
|
||||
at point X=5164.0681 Y=1621.7278 Z= 0.0000
|
||||
at point X=8085.8720 Y=-285.8238 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÂÍÊ ïðåäûäóùèé"
|
||||
Space: Model space
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc65
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3317.6669
|
||||
|
||||
at point X=4960.0683 Y=1424.3949 Z= 0.0000
|
||||
Press ENTER to continue:
|
||||
at point X=7723.9368 Y=-410.8013 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÂÍÊ"
|
||||
Space: Model space
|
||||
Color: BYLAYER Linetype: "ACAD_ISO05W100"
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc64
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3396.1871
|
||||
|
||||
at point X=4742.9072 Y=1292.8396 Z= 0.0000
|
||||
at point X=7579.1627 Y=-575.2455 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÂÍÊ"
|
||||
Space: Model space
|
||||
Linetype scaling = 25.0000
|
||||
Handle = bc63
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3489.3683
|
||||
|
||||
Press ENTER to continue:
|
||||
at point X=4558.6493 Y=1181.0176 Z= 0.0000
|
||||
at point X=7480.4531 Y=-726.5340 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÇÎÍÀ çàìåùåíèÿ"
|
||||
Space: Model space
|
||||
Linetype scaling = 125.0000
|
||||
Handle = bc62
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3733.3464
|
||||
|
||||
at point X=4189.1885 Y= 970.7753 Z= 0.0000
|
||||
at point X=7280.9041 Y=-1121.8715 Z= 0.0000
|
||||
|
||||
LWPOLYLINE Layer: "ÇÎÍÀ âûêëèíèâàíèÿ"
|
||||
Space: Model space
|
||||
Linetype scaling = 50.0000
|
||||
Handle = bc61
|
||||
Open
|
||||
Constant width 0.0000
|
||||
area 0.0000
|
||||
length 3768.5342
|
||||
|
||||
Press ENTER to continue:
|
||||
at point X=3894.5967 Y= 773.4876 Z= 0.0000
|
||||
at point X=7046.2921 Y=-1292.5875 Z= 0.0000
|
||||
|
||||
Command:
|
||||
LIST
|
||||
|
||||
Select objects:
|
||||
|
||||
Command:
|
||||
LIST
|
||||
|
||||
Select objects:
|
||||
|
||||
Command:
|
||||
LIST
|
||||
|
||||
Select objects:
|
||||
|
||||
Command:
|
||||
LIST
|
||||
|
||||
Select objects:
|
||||
|
||||
Command:
|
||||
LIST
|
||||
|
||||
Select objects:
|
||||
|
||||
Command:
|
||||
LIST
|
||||
|
||||
Select objects:
|
||||
|
||||
Command:
|
||||
LIST
|
||||
|
||||
Select objects: *Cancel*
|
||||
|
||||
Command: *Cancel*
|
||||
|
||||
Command: _close
|
||||
Command:
|
|
@ -0,0 +1,9 @@
|
|||
Programm to generate xyz file with coordinate of polyline node from AutoCAD log
|
||||
softlandia@gmail.com
|
||||
|
||||
used: -
|
||||
|
||||
using
|
||||
alg c:\log\i.log v:\dat\o.xyz
|
||||
|
||||
sample input file: 1.log
|
205
main.go
205
main.go
|
@ -4,16 +4,17 @@ import (
|
|||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
_CircleCommandIndex = 0 //internal index
|
||||
_CircleCommand = "CIRCLE" //Текст с которого начинается описание круга
|
||||
_CirclePrefixCoord = "center" //Текст с которого начинаются координаты у круга
|
||||
_CircleCommandIndex = 0
|
||||
_CircleCommand = " CIRCLE " //Текст с которого начинается описание круга
|
||||
_CirclePrefixCoord = "center point," //Текст с которого начинаются координаты у круга
|
||||
|
||||
_PolylineCommandIndex = 1 //internal index
|
||||
_PolylineCommandIndex = 1
|
||||
_PolylineCommand = "POLYLINE" //Текст с которого начинается описание полилинии ВНИМАНИЕ: "LWPOLYLINE" тоже содержит "POLYLINE"
|
||||
_PolylinePrefixCoord = "at " //Текст с которого начинаются координаты полилинии
|
||||
|
||||
|
@ -26,115 +27,169 @@ type TCommands struct {
|
|||
pntString string
|
||||
}
|
||||
|
||||
var _Cmd [2]TCommands
|
||||
var cmd [2]TCommands
|
||||
|
||||
//init - initialize function
|
||||
//fill array _Cmd
|
||||
//fill array cmd
|
||||
//at index 0 - keep parameters of Circle
|
||||
//at index 1 - keep parameters of Polyline
|
||||
//at index 2 - keep parameters of LwPolyline
|
||||
func init() {
|
||||
//Circle log record
|
||||
_Cmd[0].i = _CircleCommandIndex
|
||||
_Cmd[0].keyString = _CircleCommand
|
||||
_Cmd[0].pntString = _CirclePrefixCoord
|
||||
cmd[0].i = _CircleCommandIndex
|
||||
cmd[0].keyString = _CircleCommand
|
||||
cmd[0].pntString = _CirclePrefixCoord
|
||||
//Polyline log record
|
||||
_Cmd[1].i = _PolylineCommandIndex
|
||||
_Cmd[1].keyString = _PolylineCommand
|
||||
_Cmd[1].pntString = _PolylinePrefixCoord
|
||||
cmd[1].i = _PolylineCommandIndex
|
||||
cmd[1].keyString = _PolylineCommand
|
||||
cmd[1].pntString = _PolylinePrefixCoord
|
||||
}
|
||||
|
||||
func main() {
|
||||
var (
|
||||
index int //index of current command in _Cmd[]
|
||||
isNewCommand bool //началась новая команда
|
||||
countPolylines int //подсчёт полилиний, нужно чтобы писать "-999 -999 -999" в конце полилинии, а не в начале
|
||||
inputType int //0 - обрабатываем круги, 1 - обрабатываем полилинии
|
||||
index int //index of current command in cmd[]
|
||||
countCommands int //подсчёт найденных объектов: полилиний
|
||||
//нужно для полилиний, чтобы писать "-999 -999 -999" в конце полилинии
|
||||
outputFileName string
|
||||
inputFileName string
|
||||
iFile *os.File
|
||||
oFile *os.File
|
||||
err error
|
||||
)
|
||||
|
||||
TestInputParams()
|
||||
//exit if params not true
|
||||
if !TestInputParams() {
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Fprint(os.Stderr, "params preview ok \n")
|
||||
|
||||
fmt.Println("input file: ", os.Args[1])
|
||||
fmt.Println("output file: ", os.Args[2])
|
||||
//input type: circle -> 0, line -> 1
|
||||
if strings.Contains(os.Args[1], "/c") {
|
||||
fmt.Fprint(os.Stderr, "process CIRCLE \n")
|
||||
inputType = 0
|
||||
inputFileName = os.Args[2]
|
||||
if len(os.Args) == 3 {
|
||||
//if output file name not present in parameters
|
||||
//make output file name from input file name, change ext to "xyz"
|
||||
outputFileName = strings.TrimSuffix(os.Args[2], filepath.Ext(os.Args[2])) + ".xyz"
|
||||
} else {
|
||||
outputFileName = os.Args[3]
|
||||
}
|
||||
} else {
|
||||
fmt.Fprint(os.Stderr, "process POLYLINE \n")
|
||||
inputType = 1
|
||||
inputFileName = os.Args[1]
|
||||
if len(os.Args) == 2 {
|
||||
//if output file name not present in parameters
|
||||
//make output file name from input file name, change ext to "xyz"
|
||||
outputFileName = strings.TrimSuffix(os.Args[1], filepath.Ext(os.Args[1])) + ".xyz"
|
||||
} else {
|
||||
outputFileName = os.Args[2]
|
||||
}
|
||||
}
|
||||
|
||||
iFile, err = os.Open(os.Args[1]) //Open file to READ
|
||||
fmt.Println("input file: ", inputFileName)
|
||||
|
||||
iFile, err = os.Open(inputFileName) //Open file to READ
|
||||
if err != nil {
|
||||
fmt.Fprint(os.Stderr, "file: "+os.Args[1]+" can't open to read")
|
||||
os.Exit(2)
|
||||
}
|
||||
fmt.Fprint(os.Stderr, "opened \n")
|
||||
|
||||
oFile, err = os.Create(os.Args[2]) //Open file to WRITE
|
||||
fmt.Println("output file: ", outputFileName)
|
||||
oFile, err = os.Create(outputFileName) //Open file to WRITE
|
||||
if err != nil {
|
||||
fmt.Fprint(os.Stderr, "file: "+os.Args[2]+" can't open to write")
|
||||
fmt.Fprint(os.Stderr, "file: "+outputFileName+" can't open to write")
|
||||
os.Exit(3)
|
||||
}
|
||||
|
||||
fmt.Println("input file: ", iFile)
|
||||
fmt.Println("output file: ", oFile)
|
||||
fmt.Fprint(os.Stderr, "opened \n")
|
||||
|
||||
iScanner := bufio.NewScanner(iFile)
|
||||
for i := 0; iScanner.Scan(); i++ {
|
||||
s := iScanner.Text()
|
||||
//Поиск начала объекта
|
||||
if strings.Contains(s, _CircleCommand) {
|
||||
isNewCommand = true //найден круг
|
||||
index = _CircleCommandIndex
|
||||
}
|
||||
if strings.Contains(s, _PolylineCommand) {
|
||||
isNewCommand = true //найдена новая полилиния
|
||||
index = _PolylineCommandIndex
|
||||
//запишем конец предыдущей полилинии (если это не первая)
|
||||
//если countPolylines == 0 то это самая первая полилиния в файле и писать "концовку" не надо
|
||||
if countPolylines > 0 {
|
||||
fmt.Fprintf(oFile, "%s\n", "-999 -999 -999")
|
||||
if inputType == 1 {
|
||||
//при разборе линии надо запомнить что линия началась, когда начнётся
|
||||
//новая линия запишем -999
|
||||
if strings.Contains(s, _PolylineCommand) {
|
||||
index = _PolylineCommandIndex
|
||||
//запишем конец полилинии (если это не первая)
|
||||
if countCommands > 0 {
|
||||
fmt.Fprintf(oFile, "%s\n", "-999 -999 -999")
|
||||
}
|
||||
countCommands++
|
||||
} else {
|
||||
//пишем в консоль, чтобы видно было, что программа работает
|
||||
fmt.Fprint(os.Stderr, ".")
|
||||
//Поиск строк координат и их разбор
|
||||
if strings.Contains(s, cmd[index].pntString) {
|
||||
//строка с координатами найдена
|
||||
ProcessLine(oFile, s)
|
||||
}
|
||||
}
|
||||
countPolylines++
|
||||
}
|
||||
|
||||
//Поиск строк координат и их разбор
|
||||
if strings.Contains(s, _Cmd[index].pntString) { //находим строку с координатами
|
||||
//// if (index == _PolylineCommandIndex) || (index == _LwPolylineCommandIndex) {
|
||||
//находим "=" c конца, от этой позиции до конца это Z
|
||||
//выделяем в новую строку всё от начала до этой позиции
|
||||
//теперь здесь только X и Y
|
||||
i := strings.LastIndex(s, "=") + 1
|
||||
//выдёргиваем Z
|
||||
Z, errZ := strconv.ParseFloat(strings.TrimSpace(s[i:]), 64)
|
||||
if errZ != nil {
|
||||
fmt.Printf("strvconv not pass: '%s'\n", s[i:])
|
||||
} else { //обработка кругов
|
||||
//пишем в консоль, чтобы видно было, что программа работает
|
||||
fmt.Fprint(os.Stderr, ".")
|
||||
//при обработке кругов координата начинается с "center point,"
|
||||
if strings.Contains(s, _CirclePrefixCoord) {
|
||||
//строка с координатами найдена
|
||||
ProcessLine(oFile, s)
|
||||
}
|
||||
|
||||
s = s[1:(i - 2)] //удаляем найденное из строки, на 2 символа влево - там стоит 'Z'
|
||||
//получим: 'at point X= 7.7218 Y= 11.7846 '
|
||||
|
||||
i = strings.LastIndex(s, "=") + 1
|
||||
Y, errY := strconv.ParseFloat(strings.TrimSpace(s[i:]), 64)
|
||||
if errY != nil {
|
||||
fmt.Printf("strvconv not pass: '%s'\n", s[i:])
|
||||
}
|
||||
|
||||
s = s[1:(i - 2)] //удаляем найденное из строки, на 2 символа влево - там стоит 'Y'
|
||||
//получим: 'at point X= 7.7218 '
|
||||
|
||||
i = strings.LastIndex(s, "=") + 1
|
||||
X, errX := strconv.ParseFloat(strings.TrimSpace(s[i:]), 64)
|
||||
if errX != nil {
|
||||
fmt.Printf("strvconv not pass: '%s'\n", s[i:])
|
||||
}
|
||||
fmt.Fprintf(oFile, "%f %f %f\n", X, Y, Z)
|
||||
//// }
|
||||
}
|
||||
}
|
||||
fmt.Println(isNewCommand, index)
|
||||
if countCommands > 0 {
|
||||
fmt.Fprintf(oFile, "%s\n", "-999 -999 -999")
|
||||
}
|
||||
|
||||
fmt.Fprint(os.Stderr, "\n")
|
||||
fmt.Fprint(os.Stderr, "done: ", countCommands, " objects\n")
|
||||
}
|
||||
|
||||
//ProcessLine Обработка строки "s" с координатами x= 111 y=111 z =111
|
||||
//результат записываем в файл "f"
|
||||
func ProcessLine(f *os.File, s string) {
|
||||
i := strings.LastIndex(s, "=") + 1
|
||||
//находим "=" c конца, от этой позиции "i" до конца это Z
|
||||
//выдёргиваем Z
|
||||
Z, errZ := strconv.ParseFloat(strings.TrimSpace(s[i:]), 64)
|
||||
if errZ != nil {
|
||||
fmt.Printf("strvconv not pass: '%s'\n", s[i:])
|
||||
}
|
||||
|
||||
//выделяем в новую строку всё от начала до позиции "i"
|
||||
//теперь здесь только X и Y
|
||||
s = s[1:(i - 2)] //удаляем найденное из строки, на 2 символа влево - там стоит 'Z'
|
||||
//получим: 'at point X= 7.7218 Y= 11.7846 '
|
||||
|
||||
i = strings.LastIndex(s, "=") + 1 //находим позицию Y=
|
||||
Y, errY := strconv.ParseFloat(strings.TrimSpace(s[i:]), 64)
|
||||
if errY != nil {
|
||||
fmt.Printf("strvconv not pass: '%s'\n", s[i:])
|
||||
}
|
||||
|
||||
s = s[1:(i - 2)] //удаляем найденное из строки, на 2 символа влево - там стоит 'Y'
|
||||
//получим: 'at point X= 7.7218 '
|
||||
|
||||
i = strings.LastIndex(s, "=") + 1
|
||||
X, errX := strconv.ParseFloat(strings.TrimSpace(s[i:]), 64)
|
||||
if errX != nil {
|
||||
fmt.Printf("strvconv not pass: '%s'\n", s[i:])
|
||||
}
|
||||
fmt.Fprintf(f, "%f %f %f\n", X, Y, Z)
|
||||
|
||||
}
|
||||
|
||||
//TestInputParams - test input params
|
||||
func TestInputParams() {
|
||||
if len(os.Args) < 3 {
|
||||
fmt.Fprint(os.Stderr, "using:> alg c:\\log\\inputfile.log v:\\dat\\outputfile.xyz \n")
|
||||
os.Exit(1)
|
||||
//exit if params not true
|
||||
func TestInputParams() bool {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Fprint(os.Stderr, "using:> alg c:\\log\\i.log v:\\dat\\o.xyz \n")
|
||||
fmt.Fprint(os.Stderr, "for polyline \n\n")
|
||||
fmt.Fprint(os.Stderr, "using:> alg /c c:\\log\\i.log v:\\dat\\o.xyz \n")
|
||||
fmt.Fprint(os.Stderr, "for circle \n\n")
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче