This commit is contained in:
softland 2018-10-17 23:25:39 +03:00
Родитель d0c3d30d55
Коммит b89779f162
3 изменённых файлов: 343 добавлений и 75 удалений

204
1.log Normal file
Просмотреть файл

@ -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:

9
README.md Normal file
Просмотреть файл

@ -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
Просмотреть файл

@ -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
}