Jump to content

Координаты полилиний


Recommended Posts

Доброго все дня!

Озадачился получением координат полилиний из чертежа в nanoCAD 5.1.

Столкнулся с проблемой: не удается получить атрибуты графического объекта. Перебираю все объекты, когда нахожу полилинию, пытаюсь преобразовать типы:

if ncModelSpace.Item(i).EntityName = 'AcDbPolyline' then
ncPoly := IAcadPolyline(ncModelSpace.Item(i));

Поля, которые описаны в AcadEntity доступны, например

ncPoly.ObjectName

При попытки чтения значения из поля из объекта полилиния, например

ncPoly.Coordinates

вылетает ошибка.

В связи с этим вопрос: не реализовано что-то, или я делаю что-то не так?

Подскажите, как получить координаты полилинии?

Link to comment
Share on other sites

Подскажите, как получить координаты полилинии?

http://forum.nanocad.ru/index.php?showtopic=7021

давненько писал приложение, для получение координат полилинии. наврядли в 5.1 оно заработает.

исходники на гитхабе. там много всякого по полилиниям. может будет полезно. по 5.1 версии , по коду, не подскажу.

  • Like 1
Link to comment
Share on other sites

Но многообещающая программа.

ничего она не обещает) . все заявленные функции в нано плюс 7/8 работают. а может и выше - я не пробовал.

под новые версии нано адаптировать, личной потребности не было.

а с форума никто не спрашивал, на развитие новых функций, я тоже как бы забил вроде.

Edited by Ivanco
Link to comment
Share on other sites

Оказалось, что все замечательно работает в 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 by Сергей Ко
  • Like 1
Link to comment
Share on other sites

  • 6 months later...

Изначально был в эксел, потом перевел в ворд. Разделитель мехду Х и У - запятая, между соседними парами координат - знак абзаца. При копировании в командную строку нанокада копируется только первая пара координат, хотя в автокаде по такой схеме вроде как можно сразу все точки построить.

Десятичный разделитель какой у координат? (если не целые)

Между полилиниями какой разделитель?

Выложите координаты, лучше в эксель.

вопрос все еще актуален. Разделитель между координатами Х и У будет такой, какой скажите (хоть Ё).

Что значит "какой разделитель между полилиниями"?

Link to comment
Share on other sites

Что значит "какой разделитель между полилиниями"?

очевидно автор вопроса имеет ввиду, что в одном файле с координатами, может быть не одна полилиния (вернее набор координат для полилинии), а значит они дожны друг от друга , как то отделятся. каким то знаком. то бишь разделителем.

и выложите пример файла с координатами.

  • Like 1
Link to comment
Share on other sites

Что значит "какой разделитель между полилиниями"?

очевидно автор вопроса имеет ввиду, что в одном файле с координатами, может быть не одна полилиния (вернее набор координат для полилинии), а значит они дожны друг от друга , как то отделятся. каким то знаком. то бишь разделителем.

и выложите пример файла с координатами.

координаты полилинии.xlsx По этим координатам должен квадрат получиться с шагом 50 только как это сделать?

координаты полилинии.xlsx

Link to comment
Share on other sites

По этим координатам должен квадрат получиться с шагом 50 только как это сделать?

подайте в комстроку nanoCAD Plus 10.x: "PLINE 100,100 150,100 150,150 100,150 100,100" (т.е. команда полилиния + координаты вершин через пробел):

2019-02-20_001802.png

Link to comment
Share on other sites

По этим координатам должен квадрат получиться с шагом 50 только как это сделать?

подайте в комстроку nanoCAD Plus 10.x: "PLINE 100,100 150,100 150,150 100,150 100,100" (т.е. команда полилиния + координаты вершин через пробел):

у меня пишет "неправильный ключ", нанокад 10.1.4493.2427

post-67915-0-24804300-1550650467.png

Link to comment
Share on other sites

хм... а русское название команды? даже примерно не знаю куда копать - у меня все с лету работает ))

Link to comment
Share on other sites

  • 2 years later...

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. И объясните профану как можно запускать такие скрипты, например, горячими клавишами.

Link to comment
Share on other sites

2 часа назад, cad@maxsoft.ru сказал:

Добрый день!

Посмотрите тут. Ivanco в том числе выкладывал код на GitHub

Спасибо огромное. Но оно что-то не запускается у меня на nanoCad v.5.1. Но все равно - спасибо!

Link to comment
Share on other sites

Не могу сказать с какой версии, но команда _LIST (СПИСОК) давно реализована. Во всяком случае в версии 20.0 есть.

Также см. адаптированный пакет PLTOOLS для работы с полилиниями

 

27823_Pltools_28045_21990(2).zip

Link to comment
Share on other sites

15 минут назад, lidia.antipina.ru сказал:

Не могу сказать с какой версии, но команда _LIST

В АС это очень старинная команда. Предполагаю, что и в NC она с момента появления продукта.

Но, похоже, это не то, что нужно автору ветки.

Нужно не просто информация о координатах, а представление их в форматированном виде (в таблицу, примитивы, во вне и т.д.)

 

Link to comment
Share on other sites

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 знаков после запятой

Link to comment
Share on other sites

Цитата

как округлить да 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 by Ivanco
  • Like 1
Link to comment
Share on other sites

В 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());}

 

 

Огромное спасибо!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...