Сергей Ко Posted July 21, 2018 Report Share Posted July 21, 2018 Доброго все дня! Озадачился получением координат полилиний из чертежа в nanoCAD 5.1. Столкнулся с проблемой: не удается получить атрибуты графического объекта. Перебираю все объекты, когда нахожу полилинию, пытаюсь преобразовать типы: if ncModelSpace.Item(i).EntityName = 'AcDbPolyline' then ncPoly := IAcadPolyline(ncModelSpace.Item(i)); Поля, которые описаны в AcadEntity доступны, например ncPoly.ObjectName При попытки чтения значения из поля из объекта полилиния, например ncPoly.Coordinates вылетает ошибка. В связи с этим вопрос: не реализовано что-то, или я делаю что-то не так? Подскажите, как получить координаты полилинии? Quote Link to comment Share on other sites More sharing options...
Ivanco Posted July 23, 2018 Report Share Posted July 23, 2018 Подскажите, как получить координаты полилинии? http://forum.nanocad.ru/index.php?showtopic=7021 давненько писал приложение, для получение координат полилинии. наврядли в 5.1 оно заработает. исходники на гитхабе. там много всякого по полилиниям. может будет полезно. по 5.1 версии , по коду, не подскажу. 1 Quote Link to comment Share on other sites More sharing options...
Сергей Ко Posted July 23, 2018 Report Share Posted July 23, 2018 Тут Вы правы, в 5.1 не заработала( Но многообещающая программа. Вдруг ответят разработчики... Quote Link to comment Share on other sites More sharing options...
Ivanco Posted July 23, 2018 Report Share Posted July 23, 2018 (edited) Но многообещающая программа. ничего она не обещает) . все заявленные функции в нано плюс 7/8 работают. а может и выше - я не пробовал. под новые версии нано адаптировать, личной потребности не было. а с форума никто не спрашивал, на развитие новых функций, я тоже как бы забил вроде. Edited July 23, 2018 by Ivanco Quote Link to comment Share on other sites More sharing options...
Сергей Ко Posted July 24, 2018 Report Share Posted July 24, 2018 (edited) Оказалось, что все замечательно работает в VBA Если вдруг кто столкнется, выкладываю наброски кода (работает) 'Использованные переменные Dim ncApp As New nanoCAD.Application Dim ncDoc As nanoCAD.Document Dim MSpace As AcadModelSpace Dim ncObject As AcadEntity Dim ncPoly As AcadLWPolyline 'Создаем переменную, само подключается к приложению Set ncDoc = ncApp.ActiveDocument Set MSpace = ncDoc.ModelSpace 'Пробегаем по всем графическим объектам For ObjIndex = 0 To MSpace.Count - 1 'Если полилиния, то ищем координаты If ncObject.ObjectName = "AcDbLWPolyline" Or ncObject.ObjectName = "AcDbPolyline" Then Set ncPoly = MSpace.Item(ObjIndex) 'Пробегаем по всем координатам For i = LBound(ncPoly.Coordinates) To UBound(ncPoly.Coordinates) - 1 With Worksheets("Координаты") .Cells(Row, 1).Formula = ObjIndex + 1 .Cells(Row, 2).Formula = n .Cells(Row, 3).Formula = ncPoly.Coordinates(i) .Cells(Row, 4).Formula = ncPoly.Coordinates(i + 1) Row = Row + 1 n = n + 1 'скачем через одну позицию i = i + 1 End With Next End If Next Edited July 24, 2018 by Сергей Ко 1 Quote Link to comment Share on other sites More sharing options...
markZSK Posted February 19, 2019 Report Share Posted February 19, 2019 Изначально был в эксел, потом перевел в ворд. Разделитель мехду Х и У - запятая, между соседними парами координат - знак абзаца. При копировании в командную строку нанокада копируется только первая пара координат, хотя в автокаде по такой схеме вроде как можно сразу все точки построить. Десятичный разделитель какой у координат? (если не целые) Между полилиниями какой разделитель? Выложите координаты, лучше в эксель. вопрос все еще актуален. Разделитель между координатами Х и У будет такой, какой скажите (хоть Ё).Что значит "какой разделитель между полилиниями"? Quote Link to comment Share on other sites More sharing options...
Ivanco Posted February 19, 2019 Report Share Posted February 19, 2019 Что значит "какой разделитель между полилиниями"? очевидно автор вопроса имеет ввиду, что в одном файле с координатами, может быть не одна полилиния (вернее набор координат для полилинии), а значит они дожны друг от друга , как то отделятся. каким то знаком. то бишь разделителем. и выложите пример файла с координатами. 1 Quote Link to comment Share on other sites More sharing options...
markZSK Posted February 19, 2019 Report Share Posted February 19, 2019 Что значит "какой разделитель между полилиниями"? очевидно автор вопроса имеет ввиду, что в одном файле с координатами, может быть не одна полилиния (вернее набор координат для полилинии), а значит они дожны друг от друга , как то отделятся. каким то знаком. то бишь разделителем. и выложите пример файла с координатами. координаты полилинии.xlsx По этим координатам должен квадрат получиться с шагом 50 только как это сделать? координаты полилинии.xlsx Quote Link to comment Share on other sites More sharing options...
dows Posted February 20, 2019 Report Share Posted February 20, 2019 По этим координатам должен квадрат получиться с шагом 50 только как это сделать? подайте в комстроку nanoCAD Plus 10.x: "PLINE 100,100 150,100 150,150 100,150 100,100" (т.е. команда полилиния + координаты вершин через пробел): Quote Link to comment Share on other sites More sharing options...
markZSK Posted February 20, 2019 Report Share Posted February 20, 2019 По этим координатам должен квадрат получиться с шагом 50 только как это сделать? подайте в комстроку nanoCAD Plus 10.x: "PLINE 100,100 150,100 150,150 100,150 100,100" (т.е. команда полилиния + координаты вершин через пробел): у меня пишет "неправильный ключ", нанокад 10.1.4493.2427 Quote Link to comment Share on other sites More sharing options...
dows Posted February 20, 2019 Report Share Posted February 20, 2019 хм... а русское название команды? даже примерно не знаю куда копать - у меня все с лету работает )) Quote Link to comment Share on other sites More sharing options...
Иван_ Posted September 9, 2021 Report Share Posted September 9, 2021 forEach(ThisDrawing.PickFirstSelectionSet, function(ent) { if (ent.EntityName != "AcDbPolyline") return; var vv = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(ent.Coordinates)); var coords = vv.toArray(); //echo(coords.length); echo(coords); }) function echo(msg) {ThisDrawing.Utility.Prompt(msg);} function forEach(coll, fn) {for (var enu = new Enumerator(coll); !enu.atEnd(); enu.moveNext()) fn(enu.item());} Пользуюсь этим скриптом. Но как его модифицировать, так чтоб он x/y местами менял. Может кто сталкивался с такой проблемой. Спасибо! P.S. И объясните профану как можно запускать такие скрипты, например, горячими клавишами. Quote Link to comment Share on other sites More sharing options...
Иван_ Posted September 9, 2021 Report Share Posted September 9, 2021 И ещё чтобы координаты округлялись до 2 знаков после запятой. Спасибо! Quote Link to comment Share on other sites More sharing options...
cad@maxsoft.ru Posted September 10, 2021 Report Share Posted September 10, 2021 17 часов назад, Иван_ сказал: так чтоб он x/y местами менял. М Добрый день! Посмотрите тут. Ivanco в том числе выкладывал код на GitHub Quote Link to comment Share on other sites More sharing options...
Иван_ Posted September 10, 2021 Report Share Posted September 10, 2021 2 часа назад, cad@maxsoft.ru сказал: Добрый день! Посмотрите тут. Ivanco в том числе выкладывал код на GitHub Спасибо огромное. Но оно что-то не запускается у меня на nanoCad v.5.1. Но все равно - спасибо! Quote Link to comment Share on other sites More sharing options...
lidia.antipina.ru Posted September 10, 2021 Report Share Posted September 10, 2021 Не могу сказать с какой версии, но команда _LIST (СПИСОК) давно реализована. Во всяком случае в версии 20.0 есть. Также см. адаптированный пакет PLTOOLS для работы с полилиниями 27823_Pltools_28045_21990(2).zip Quote Link to comment Share on other sites More sharing options...
EdwardSt Posted September 10, 2021 Report Share Posted September 10, 2021 15 минут назад, lidia.antipina.ru сказал: Не могу сказать с какой версии, но команда _LIST В АС это очень старинная команда. Предполагаю, что и в NC она с момента появления продукта. Но, похоже, это не то, что нужно автору ветки. Нужно не просто информация о координатах, а представление их в форматированном виде (в таблицу, примитивы, во вне и т.д.) Quote Link to comment Share on other sites More sharing options...
lidia.antipina.ru Posted September 10, 2021 Report Share Posted September 10, 2021 Начиналось с того, что типа _LIST не было (в nanoCAD локализованном можно и LIST без подчеркивания). См. также Quote Link to comment Share on other sites More sharing options...
Иван_ Posted September 10, 2021 Report Share Posted September 10, 2021 forEach(ThisDrawing.PickFirstSelectionSet, function(ent) { if (ent.EntityName != "AcDbPolyline") return; var vv = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(ent.Coordinates)); var coords = vv.toArray(); //echo(coords.length); for (i = 0; i<coords.length; i += 2) { ThisDrawing.Utility.Prompt(coords[i+1] + " " + coords[i]); } }) function echo(msg) {ThisDrawing.Utility.Prompt(msg);} function forEach(coll, fn) {for (var enu = new Enumerator(coll); !enu.atEnd(); enu.moveNext()) fn(enu.item());} Теперь координаты x/y на месте и разделитель пробел. Осталось сообразить как округлить да n знаков после запятой Quote Link to comment Share on other sites More sharing options...
Ivanco Posted September 10, 2021 Report Share Posted September 10, 2021 (edited) Цитата как округлить да n знаков после запятой Так - два разных варианта округления до двух знаков. Спойлер forEach(ThisDrawing.PickFirstSelectionSet, function(ent) { if (ent.EntityName != "AcDbPolyline") return; var vv = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(ent.Coordinates)); var coords = vv.toArray(); //echo(coords.length); var firstCoord; var secondCoord; for (i = 0; i<coords.length; i += 2) { firstCoord = Math.round((coords[i+1])*100)/100; secondCoord = coords[i].toFixed(2); ThisDrawing.Utility.Prompt(firstCoord + " " + secondCoord); } }) function echo(msg) {ThisDrawing.Utility.Prompt(msg);} function forEach(coll, fn) {for (var enu = new Enumerator(coll); !enu.atEnd(); enu.moveNext()) fn(enu.item());} Edited September 10, 2021 by Ivanco 1 Quote Link to comment Share on other sites More sharing options...
Иван_ Posted September 13, 2021 Report Share Posted September 13, 2021 В 10.09.2021 в 18:05, Ivanco сказал: Так - два разных варианта округления до двух знаков. код (Скрыть контент) forEach(ThisDrawing.PickFirstSelectionSet, function(ent) { if (ent.EntityName != "AcDbPolyline") return; var vv = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(ent.Coordinates)); var coords = vv.toArray(); //echo(coords.length); var firstCoord; var secondCoord; for (i = 0; i<coords.length; i += 2) { firstCoord = Math.round((coords[i+1])*100)/100; secondCoord = coords.toFixed(2); ThisDrawing.Utility.Prompt(firstCoord + " " + secondCoord); } }) function echo(msg) {ThisDrawing.Utility.Prompt(msg);} function forEach(coll, fn) {for (var enu = new Enumerator(coll); !enu.atEnd(); enu.moveNext()) fn(enu.item());} forEach(ThisDrawing.PickFirstSelectionSet, function(ent) { if (ent.EntityName != "AcDbPolyline") return; var vv = new VBArray(ThisDrawing.Utility.CreateSafeArrayFromVector(ent.Coordinates)); var coords = vv.toArray(); //echo(coords.length); var firstCoord; var secondCoord; for (i = 0; i<coords.length; i += 2) { firstCoord = Math.round((coords[i+1])*100)/100; secondCoord = coords[i].toFixed(2); ThisDrawing.Utility.Prompt(firstCoord + " " + secondCoord); } }) function echo(msg) {ThisDrawing.Utility.Prompt(msg);} function forEach(coll, fn) {for (var enu = new Enumerator(coll); !enu.atEnd(); enu.moveNext()) fn(enu.item());} Огромное спасибо! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.