Перейти к содержанию

Рекомендуемые сообщения

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

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

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

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

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

ncPoly.ObjectName

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

ncPoly.Coordinates

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
Подскажите, как получить координаты полилинии?

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
Но многообещающая программа.

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

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

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

Изменено пользователем Ivanco
Ссылка на сообщение
Поделиться на другие сайты

Оказалось, что все замечательно работает в 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

Изменено пользователем Сергей Ко
Ссылка на сообщение
Поделиться на другие сайты
  • 6 месяцев спустя...

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

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
Что значит "какой разделитель между полилиниями"?

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

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

Ссылка на сообщение
Поделиться на другие сайты
Что значит "какой разделитель между полилиниями"?

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

2019-02-20_001802.png

Ссылка на сообщение
Поделиться на другие сайты

По этим координатам должен квадрат получиться с шагом 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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
  • 2 года спустя...

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

Ссылка на сообщение
Поделиться на другие сайты
17 часов назад, Иван_ сказал:

так чтоб он x/y местами менял. М

Добрый день!

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

Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, cad@maxsoft.ru сказал:

Добрый день!

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

27823_Pltools_28045_21990(2).zip

Ссылка на сообщение
Поделиться на другие сайты
15 минут назад, lidia.antipina.ru сказал:

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

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

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

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

 

Ссылка на сообщение
Поделиться на другие сайты

Начиналось с того, что типа _LIST не было (в nanoCAD локализованном можно и LIST без подчеркивания).

См. также 

 

Ссылка на сообщение
Поделиться на другие сайты
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 знаков после запятой

Ссылка на сообщение
Поделиться на другие сайты
Цитата

как округлить да 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());}

 

 

Изменено пользователем Ivanco
Ссылка на сообщение
Поделиться на другие сайты
В 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());}

 

 

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
×
×
  • Создать...