AutoLISP: Длина 3D солида "Sweep" или сплайна
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLISP: Длина 3D солида "Sweep" или сплайна

AutoLISP: Длина 3D солида "Sweep" или сплайна

Ответ
Поиск в этой теме
Непрочитано 17.10.2010, 13:11 #1
AutoLISP: Длина 3D солида "Sweep" или сплайна
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Обрабатываю набор из 3D солидов типа "Sweep" (вытянутых по пути). У такого элемента есть свойство Длинна, но получить его в явном виде хоть через vla-get..., хоть через DXF коды пока не пойму как.
В недрах такого 3D солида лежит примитив, по которому он вытянут и когда это сплайн - опять возникает вопрос как получить его длинну?
Ручками его не подсветишь и команду к нему не применишь.
Кто чем может помочь?

Темы про длинну сплайна не торопитесь мне ссылками давать. Там нет ответа для программиста.
Просмотров: 4180
 
Непрочитано 17.10.2010, 17:24
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Покопавшись через историю dxf можно выйти и на образующий region (коды сейчас не вспомню - но точно можно - где-то рядом с путем), так его площадь, деленная на объем фигуры и даст длинну (таким образом, кстати, можно и длинну сплайна "програмно" найти).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.10.2010, 17:44
#3
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Дима_ Посмотреть сообщение
так его площадь, деленная на объем фигуры и даст длинну (таким образом, кстати, можно и длинну сплайна "програмно" найти).
Дима_, так будет только если параметр "масштабирование вдоль траектории" равно 1 (по умолчанию оно так и есть), а вот если его изменить, то при одной и той же длине объем фигуры будет разный, а соответственно и деление объема на площадь может дать совсем не верный результат
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 17.10.2010, 21:59
#4
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Была надежда на GeomProps Александра Ривилиса, да в 2010 каде почему-то нет лисп-функций этого arx модуля. В свойствах все работает, а лиспов нет.
Supermax вне форума  
 
Непрочитано 18.10.2010, 08:50
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Была надежда на GeomProps Александра Ривилиса, да в 2010 каде почему-то нет лисп-функций этого arx модуля. В свойствах все работает, а лиспов нет.
Зря надеялся. Т.к. нет официального API для получения информации о "длине" из 3DSOLID, то GeomProps её и не получает. И вообще для 3DSOLID определены только площадь и объем.
P.S.: Лисп-функции добавил. Пробуй.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 18.10.2010, 09:49
#6
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Рад пообщаться, Александр.
Я с Вами не соглашусь.
Во-первых у 3D солидов "Sweep" есть длинна и она прямо указана в панели "Свойства".
Во вторых, я сам 3D солид и не собираюсь мучать по поводу длинны. Но в нем есть образующий примитив, тот самый, который был избран как путь. Вот его длинна прекрасно получается при помощи вашей замечательной программы.

P.S. Ура! Огромное спасибо! Я сознательно иду на то, что моя прога без Вашей работать не будет. А Ваш модуль надо AutoDesk-у купить и поставлять кады вместе с ним. Еще раз, низкий поклон.

P.S.2 Есть один огорчающий момент. Если сохранить файл из 2010 формата в 2004 - у солидов обнуляется история и данные об их "длинне" исчезают. Попробую поковыряться в 1-ых точечных парах.

Последний раз редактировалось Supermax, 18.10.2010 в 10:33.
Supermax вне форума  
 
Непрочитано 18.10.2010, 11:18
#7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Во-первых у 3D солидов "Sweep" есть длинна и она прямо указана в панели "Свойства".
Я где-то сказал, что нет такого свойства? Я сказал что нет API, которое бы позволило получить это свойство. Точнее есть BREP, при помощи которого можно получить различную информацию, но тут придется догадываться что есть "длина". А в чистом виде такого API нет.
Цитата:
Сообщение от Supermax Посмотреть сообщение
Во вторых, я сам 3D солид и не собираюсь мучать по поводу длинны. Но в нем есть образующий примитив, тот самый, который был избран как путь. Вот его длинна прекрасно получается при помощи вашей замечательной программы.
Ссылка на него хранится в самом 3DSOLID? Тогда конечно его длину можно получить. В противном случае никак.

Цитата:
Сообщение от Supermax Посмотреть сообщение
Если сохранить файл из 2010 формата в 2004 - у солидов обнуляется история и данные об их "длинне" исчезают.
Вот-вот. Увы, но (IMHO) это тупиковый путь.

P.S.: А что есть проблема в том, чтобы средствами VisulLisp получить длину сплайна?
Код:
[Выделить все]
(defun curve_length (en)
  (vlax-curve-getDistAtParam en (vlax-curve-getEndParam en))
)
Вроде так должно работать. Или нет?

Последний раз редактировалось Александр Ривилис, 18.10.2010 в 11:30.
Александр Ривилис вне форума  
 
Непрочитано 18.10.2010, 12:39
#8
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Интересно, а если такое тело типа "Sweep" разрезать пополам, к примеру, то что покажет этот самый "путь" ?
Евгений А. вне форума  
 
Непрочитано 18.10.2010, 13:00
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


После "булевских" операций - "исторические" свойства типа длинны, оно-же как и ручки, естественно исчезнут.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.10.2010, 16:06
#10
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Тогда точно "это тупиковый путь"
Евгений А. вне форума  
 
Автор темы   Непрочитано 18.10.2010, 19:38
#11
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Не, господа. Я с вами не согласен. 2007 формат историю не рубит. Создание 3D солида по пути и возможность его корректировки в 2007 формате уже есть. Резать такой солид никто не намерен, да и свой тип он кажется тоже меняет. А история - нет ничего проще. 350 пара если имеет нулевой указатель, то есть возвращает nil при его чтении, однозначно выбрасывает такой солид из набора.
Я создаю модели, где таким способом раскладываются медные импульсные трубки. Я намеревался оставлять спланы (они и так остаются после вытягивания) или брать объем и делить на площадь, но убивает это свойство "длинна" и то, что два других типа 3D солидов я научился измерять длинну.
Еще малость побъюсь и сюда решение выложу.

Александр Ривилис, за код спасибо. Я его обязательно использую.
Supermax вне форума  
 
Непрочитано 18.10.2010, 20:11
#12
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


А че в блок нельзя при создании обернуть... с аттрибутами и всей прочей шелухой... или xdata на худой конец...
gomer вне форума  
 
Автор темы   Непрочитано 18.10.2010, 23:00
#13
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Образующий примитив оказался ссылкой на первый элемент модели. Я по наивности рисовал сплайн в пустом чертеже и вытягивал по нему. Вот он в "передовики" и попал (зараза).
Вскрыл мозги 1-ым точечным парам. Там ничего полезного не оказалось. А 3-и пары как открывать не знаю.
Всю историю перерыл - ничего полезного не нашел.

Александр Ривилис

Цитата:
... Точнее есть BREP, при помощи которого можно получить различную информацию, но тут придется догадываться что есть "длина"...
А по подробнее? Заинтриговали, однако. Пли-и-из!

Хочу объяснить, почему именно 3D солиды хочу мерять, да еще и вытянутые по пути:

Рисую сплайн (будущая импульсная трубка). Рисуется как бог на душу придется. За ручки растаскиваю в разных направлениях, чтобы не пересекался с различными трубами и агрегатами. Рисую кружок (сечение трубки) и вытягиваю по пути. НО! Потом приходится рядом еще что-то ставить и трубку надо подвинуть. Все двигается, ведь такой 3D солид за ручки можно растащить как и сплайн, но опять НО. Сплайн не могу скорректировать по 3D солиду, поскольку к его ручкам ничего не примагничивается и я остаюсь без длины. Точнее я ее вижу в свойствах, а списать никак.
Приходится двигать сплайн и по новой вытягивать.
Придется наверное делить объем на площадь.

А еще хотел написать функцию, которая измеряет длину всему, что ее имеет. Два типа 3Dсолидов и так можно длину посмотреть, вот хотел тоже в эту функцию запихнуть, но видать не судьба (все же площадь надо в аргументы вставить, тогда любые солиды померяет, но не совсем правильно).

Последний раз редактировалось Supermax, 18.10.2010 в 23:09.
Supermax вне форума  
 
Непрочитано 18.10.2010, 23:23
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Ты в сторону MEP посмотри, я тебе не первый раз об этом говорю
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.10.2010, 23:42
#15
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Ты в сторону MEP посмотри, я тебе не первый раз об этом говорю
Да, да. Только я не свои задачи решаю (к сожалению). Такая вот штука, что моделировать объект надо мне, но с помощью фрилансеров и других разных ...серов, а у них ниже голого када точно ничего не бывает.
Да и как все внешними ссылками в одну модель собирать? И где собирать? В МЕР-е рисовать, а в голом каде собирать? Как подружить ADT, MEP и прочие вертикалки друг с другом?

И вот то же смущает:
Цитата:
Что может АutoCAD MEP?
Программа позволяет вносить изменения в существующие чертежи, создавать новые, обрабатывать и перерабатывать их. Возможно создание сечений, разрезов и спецификаций. В программе AutoCAD MEP присутствуют некоторые расчетные функции. Можно задав трассировку и назначив точки нагрузки рассчитать сечения канальной сети. Рассчитанная канальная сеть представляется автоматически в виде 3D модели.

Подобный расчет не рекомендуется брать как эталон при строительстве, так как расчеты ведутся по западным нормам. Однако, полученную 3D схему можно использовать для приблизительного ознакомления с проектом.
А мне надо собирать модель из грфических прототипов реально выпускаемой продукции!
Supermax вне форума  
 
Непрочитано 19.10.2010, 00:07
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
А по подробнее? Заинтриговали, однако. Пли-и-из!
BREP (Boundary Representation Library) содержится в составе ObjectARX SDK. Почитай, посмотри готовые примеры и поймешь что в общем случае это не применимо. Т.е. ты получишь набор вершин/граней/поверхностей, образующих твое тело (3DSOLID). И что дальше?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 19.10.2010, 00:51
#17
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Да, жаль. Будем выкручиваться.

Вот примерно такое начало моей будущей функции по замеру длин всего, что плохо лежит.
Код:
[Выделить все]
(defun generallength (block tip area color linetip weight / layerblc nab1 primnab listnab vlalistnab)
;|
block - строка - имя переменной в которую записан указатель на обрабатываемый блок
tip - пятизначное бинарное число 
   1-ый знак - 3D солид, 1/0 1-обрабатывать, 0 - нет
   2-ой - линия, 1/0 1-обрабатывать, 0 - нет
   3-й - 2D полилиния, 1/0 1-обрабатывать, 0 - нет
   4-ый - 3D полилиния, 1/0 1-обрабатывать, 0 - нет
   5-ый - сплайн, 1/0 1-обрабатывать, 0 - нет
area - площадь сечения, на которую делится объем 3D солидов, кроме "ACSH_EXTRUSION_CLASS" и "ACSH_CYLINDER_CLASS"
   у них если есть "история" длинна вычисляется по ней.
   Если данный аргумент nil, то все 3D солиды, кроме этих двух классов - не обрабатываются.
color - если целое число до 3-х знаков - 62 точечная пара, 0 - ByBlock, 256 - ByLayer
   если целое число более 3-х знаков - 420 точечная пара с точным цветом,
   если строка - 430 точечная пара название цвета из альбома Автокада,
   если несовпадение - все цвета
linetip - строка с типом линий (свойство Linetype), 
   если несовпадение - все типы
weight - толщина линий, целое число -1 - ByLayer, -2 - ByBlock (0,05 - 5; 2.11 - 211; 0,000 - 0)
   если несовпадение - все толщины

Функция возвращает общую длинну всех примитивов прошедших сквозь фильтр ее аргументов.
|;
Еще одно разочарование:
Если обрабатывать 3D солиды в зависимости от их SolidType, то надо обрабатывать ошибки. Дело в том, что после подрезки 3D солида его "SolidType (RO) = Ошибка"

Последний раз редактировалось Supermax, 19.10.2010 в 10:06.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLISP: Длина 3D солида "Sweep" или сплайна



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длина сплайна. Dimkach AutoCAD 2 16.11.2009 12:14
Длина сплайна ИРИК AutoCAD 3 05.02.2009 13:05