| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
02.02.2009, 21:54 | #1 | |
Lisp в 3D
ООО Предприятие "Ирбис"
Екатеринбург
Регистрация: 02.02.2009
Сообщений: 45
|
||
Просмотров: 13319
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,849
|
группы 220 и 230 появляются только в DXF-формате. В ename-представлении они есть необязательно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Группа 210 обычно имеет вид (210 0.0 0.0 1.0), то есть представляет собой единичный вектор, направленый вдоль оси z. Только с помощью этой группы можно повернуть примитив как угодно - например (210 1.0 0.0 0.0) повернет примитив вдоль оси x, хотя и с некоторыми оговорками - надо контролировать поворот примитива вокруг нормали.
Вопрос в другом. Важна наглядность, как с командой ROTATE. То есть в процессе поворота с помощью мыши примитив вращается вместе с курсором, пока щелчком не будет указан угол. Можно было бы задать цикл, в котором командой типа getangle считывался бы угол и в соответствии с этим выполнялось обновление примитива. Но: 1. getangle требует "второго" щелчка для получения угла 2. возможно существует более легкий способ обеспечения наглядности Если есть команда, которая считывала бы положение курсора с учетом привязок без клика - буду безмерно признателен Последний раз редактировалось eugen81, 03.02.2009 в 12:08. |
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Чтоб легче было понять, что мне нужно, опишу то, над чем я работаю.
Необходимо изобразить в акаде ИТП (индивидуальный тепловой пункт). То есть рисую трубы, вставляю фланцы, задвижки и прочую аттрибутику. так как это приходится делать довольно часто, то ручное рисование труб и вставка блоков с арматурой быстро надоело. Задача сводится к следующему: Запускаю программу, начинаю рисование скажем с ввода теплотрассы, то есть трубы. Задаем начальное направление оси и рисуем. После того, как нарисовал трубу программа через контекстное меню предлагает вставить объект (фланец, отвод, переход и т.д.) соответствующий условному диаметру. Допустим выбрали фланец. Его я вставляю в качестве блока из файла через (VL-CMDF "INSERT"...) (каюсь, не люблю я вызывать команды акада из лиспа, но другого выхода не вижу). В файле фланец ориентирован осью по оси z. Соответственно в чертеже фланец должен быть ориентирован по оси трубы, для чего я корректирую группу 210. Затем нужно повернуть фланец вокруг оси. Причем так, чтобы я мог контролировать вращение визуально в реальном времени, а не по факту ввода значения угла. |
|||
|
||||
>eugen81
Управление вектором нормали, недостаточно для задания ориентирования объекта. Дело в том, что одну и ту же плоскость, можно задать двумя противоположными векторами. При вычислении необходимого вектора программно, не удается правильно расположить объект в пространстве, используя только вектор нормали. После поворота плоскости объекта, расположение внутренней ориентации объекта в данной плоскости меняется. Приходится еще использовать вращение в этой плоскости. Не советую пытаться расположить блок, примитив или другой объект в пространстве, используя только вектор нормали. Сразу разрабатывай программу, умеющую определять необходимый угол поворота в нужной плоскости в пространстве, относительно произвольной точки. |
||||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Я некорректно выразил свою просьбу вектором нормали я задаю только "ось" объекта. На примере того же фланца - добиваюсь, чтобы его зеркало смотрело по оси в нужную мне сторону. А затем корректирую положение объекта вокруг этой оси путем изменения групп... эххх, справочника рядом нет... в общем нужная ориентация объекта получается без каких-то проблемм.
Вопрос-то в том, есть ли аналог команды ROTATE (или как его самому сделать), позволяющий повернуть объект с отслеживанием по указанной оси. Просто специфика работы такая, что просто вводить градусы с клавиатуры не всегда удобно, так как трубы могут идти как угодно. Я пытаюсь написать программу, которая была бы удобна не только для меня, но и для другого проектировщика. Поэтому необходима максимальная интерактивность. Последний раз редактировалось eugen81, 03.02.2009 в 15:38. |
|||
|
||||
Цитата:
Думаю, после этого, будет понятна твоя задумка и уменьшится количество вариантов, как это сделать. |
||||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Именно так, объект вращается вслед за резиновой нитью. И поворачивать вокруг оси его нужно сразу после создания. Ось поворота - это вектор нормали блока. Все объекты в собраной мной базе ориентированы именно по нормали. При вставке блока сразу же меняется группа 210
Последний раз редактировалось eugen81, 03.02.2009 в 17:19. |
|||
|
||||
|
||||
|
||||
eugen81, перечитал тему сначала, понял.
Сейчас сделаю примерчик, программы, только выложи мне пример блока - задвижки какой нибудь, чисто для экспериментов...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:26. |
||||
|
||||
Кстати, если блок сделать так, чтоб его вектор нормали и точка вставки, совпадали с осью трубы, то программа сильно упрощается - нужно просто программно вставить блок с нужным вектором нормали, а потом просто крутить его интерактивно...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:26. |
||||
|
||||
расскажи с примерами, как ты смотрел высоту и где...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:25. |
||||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Простой пример:
рисую цилиндр диаметром 57мм, высотой 150мм из точки (0, 0, 0) далее: Код:
Код:
|
|||
|
||||
Цитата:
Пособие по формату файла SAT (ACIS)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 16.02.2009 в 22:25. |
||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
|
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Не секрет. Если я собираюсь писать приложение, которое, возможно, претендует на полноценную надстройку к автокаду, то азы 3д я точно должен знать
Да и вопрос собственно встает таким образом. Труба - это ведь цилиндр, хоть и условно. Для выполнения модели теплового узла - вполне достаточно. Остается проблема программного изменения параметров этой трубы - диаметра, длины, расположения в пространстве. И если я уж начал оперировать блоками на таком уровне, что вставляю, ориентирую, выдергиваю атрибуты через функции доступа к примитивам, то желательно и параметрами других солидов начиться управлять на том же уровне Последний раз редактировалось eugen81, 04.02.2009 в 12:30. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
eugen81, ты идешь в неверном направлении, зайдешь в темный лес SAT, а результата не будет.
Хочешь всерьез сделать 3D хотя бы для труб и всего, что с ними связано? Не заморачивайся с DXF-кодами! Покажу несколько картинок. Всё, что там смоделировано - только на LISP, там нет вообще блоков, только солиды. Даже насос - один солид. Нигде DXF-кодов применять не пришлось. Вот на чем сосредотачивай усилия: 1. Библиотека функций для 3D, основанная на векторах. Чтоб любую точку в пространстве можно было определить так же просто, как с помощью polar на плоскости. 2. Интерфейс пользователя. Сначала - выбор требуемого изделия (в картинках пример иллюстрированного меню). Потом - удобная трассировка в пространстве. Чтобы минимум ввода в виде координат, а побольше выборов указанием на направления. 3. Стыковка элементов. Если уже есть труба, а на ней надо поставить задвижку, задвижка должна полуавтоматом пристыковаться к концу трубы, а потом уже у неё интерактивно надо задать направление шпинделя. Именно визуальным вращением, только в 3D и вокруг оси трубы. Если уже есть труба, и под неё надо подставить опору (см. рис), то надо только указать точку на оси трубы (ось должна быть, а саму трубу надо уметь на этот момент скрыть ( чтоб ось увидеть), и опора должна сама нарисоваться вниз на заданную высоту. Вот в этом направлении надо усилия направлять. |
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
ShaggyDoc, именно этого я и хочу добиться. Я лиспом начал заниматься только три месяца назад и то с большими перерывами ввиду большой загруженности на работе.
Управление блоком через DFX коды показалось мне довольно удобным. Из блока с помощью DFX я легко выдергиваю атрибуты, в которых записан условный диаметр той же задвижки, ее монтажная длина, с помощью которой программно вычисляется точка вставки следующего объекта. И хоть меню выбора объекта у меня не так красиво как у вас но выбор происходит только из Ду предыдущего объекта. То есть если труба была Ду50, то я не смогу вставить задвижку DN80 без перехода. Мне кажется, блоки тем и хороши, что позволяют хранить необходимую информацию внутри самого блока. Но к сожалению трубу, у которой изменяемая длина, я не могу вставить блоком. Знаний пока мало. Поэтому и залез в солиды. |
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
И еще:
Допустим, что необходимо укоротить какой-то кусок трубы, после которой вы повесили арматуру и еще много всякого добра. То есть после укорачивания так же должны будут сдвинуться по оси все объекты. Каким образом вы это реализуете, используя солиды? |
|||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
>>Очень глубокая мысль....Читал...Долго думал...
ИМХО. солиды в автокаде вещь не родная. имеется для "галочки" по вашему работать с 3д - везде где надо и не надо тыкать солиды? >>Покажу несколько картинок. Всё, что там смоделировано - только на >>LISP, там нет вообще блоков, только солиды. Даже насос - один >>солид. Нигде DXF-кодов применять не пришлось. вот именно - картинок. при таком подходе возникнут сложности с хранением неграфической информации - dy труб у вас где хранится? а если понадобится чтото поменять - колено в трубу какуюнибудь врезать? солид заново пересоздавать? |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Цитата:
Код:
Код:
Если я начну сейчас расшифровывать приведенные высокоуровневые функции до самого "низа", т.е. до штатных средств Автокада, это будет длинная цепочка и займет много страниц. Это более 400 связанных между собой отдельных функций, каждая из которых делает своё дело. Сам момент вращения очень прост: Код:
Код:
Подобные вещи реализуются только при использовании CUSTOM-объектов на ObjectARX. Создается не просто 3DSOLID, а совершенно новый класс, отсутствующий в "голом" AutoCAD - под названием, например, PIPE. Такой объект имеет свойства наподобие наружного диаметра, толщины стенки, длины. А также обладает способностью изменять свою геометрию при сдвижке смежных объектов. А смежные объекты, такие как СТЕНА, умеют "протыкаться" при прохождении через них трубы. Это продукты класса MEP, ADT, ABS (куча, меняющая свои названия по мере развития). Но, если мы можем построить трубу средствами обычного LISP одним щелчком по оси трубы, так нам, при изменении геометрии проще эту трубу стереть, укоротить или удлинить ось, а потом одним щелчком заново построить. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Я разве написал, что надо втыкать, куда не надо? "Втыкать" вообще надо только то, "что надо" и "куда надо". Если кто-то куда-то не туда втыкает, не надо подозревать других
Цитата:
|
|||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
>>Родной, сделай такие картинки, покажи, а потом и поговорим. И про где что хранится, где Ду, где Ру, и про подходы, и про отходы, и как врезать
Для создания таких картинок есть гораздо более удобные средства чем автокад+лисп. Ни сколько не умаляю Ваших трудов при разрабоке программы, но это не более чем красивые картинки |
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Давайте только не будем устраивать войну из-за различных подходов к моделированию
ShaggyDoc: на мой взгляд работа с блоками и DFX кодами тем и удобна, что удобно хранить и извлекать неграфическую информацию из самих объектов. Можно было бы хранить ее, скажем, в отдельной базе данных, но тогда возникла бы проблема синхронизации этой базы с солидами. Так же возникает вопрос. Открываем новый чертеж проекта, который необходимо наполнить. Как я понял, все ваши солиды формируются на ходу, то есть каждый раз обсчитываются при вставке. Тогда опять возникает проблема, которая часто имеет место в процессе создания проекта. Заказчик вдруг понимает, что на устанавливаемое оборудование у него не хватает денег, просит вставить что-нибудь попроще. А это что-то попроще вдруг имеет другие установочные размеры. Или что еще хуже - делать реконструкцию узла, когда здание разобрано на половину. По рабочему проекту строителей планировка помещения будет такая, а на самом деле сделают все по другому. А вручную перерисовывать трубы и другую атрибутику в новых местах - это, извините, геморой, от которого руки опускаются. Моя цель - тупо в списке оборудования меняешь объект на новый, указываешь мышью объекты, которые необходимо подвинуть, и просто говоришь программе "действуй". В случае использования DFX - правятся нужные группы и все. они сами встали на свое место. при использованиии солидов - приходится перерисовывать все заново. Да и код, если его развернуть до функций автокада с использованием DFX и готовых блоков занимает гораздо меньше места, чем вы сказали, что облегчает его проверку и модификацию в случае необходимости. Но с другой стороны есть и такие ситуации, где блоки, как и DFX коды бесполезны, или по крайней мере применять их было бы делом не оправдывающим себя. Так что всегда надо искать компромисс Последний раз редактировалось eugen81, 04.02.2009 в 19:47. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,849
|
Неграфическую информацю как из DXF кодов извлекать - удовольствие весьма сомнительное (сугубо ИМХО). Особенно учитывая непредсказуемый объем информации.
По задаче работы с трубами и арматурой: если ты еще не сильно завязан на AutoCAD, посмотри AutoCAD MEP или Revit MEP. Времени на изучение потратишь вряд ли больше, но большинство "хотелок" там реализовано, как мне кажется.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Кулик Алексей aka kpblc, по крайней мере извлечение до сих пор необходимой мне информации (в основном атибуты блоков и, собственно, имен примитивов для построения спецификаций) не представляло проблем, потому что информация эта находилась во вполне ожидаемых местах и в необходимом объеме. Функцию для вытаскивания атрибутов при почти полном отсутствии опыта программирования в лисп написал и отладил за 15 минут. Проблемой было определить местоположение этой информации, так как справочник ввиду его специфичности удалось приобрести много позже.
Если кому интересно выкладываю код функции. Сразу оговорюсь - атрибуты в блоке для удобства имеют вид "Dy 50" "L 150" Код:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,849
|
Мой слегка переделанный вариант:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Кулик Алексей aka kpblc, "слегка", говоришь? как говорил один великий человек - учиться, учиться и еще раз учиться... до activex я еще не дошел, так что многое здесь мне непонятно. Придется форсировать свое обучение. Найти бы время на все это...
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,849
|
Под "слегка" имелась в виду переделка того, что у меня самого используется. Почему я предпочитаю получать указатели на атрибуты: если понадобится, можно будет "легким движением" поменять слой, цвет, тип, вес линии, стиль и еще до дури параметров
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,849
|
Так там же все написано. Есть объект, есть у него запрашиваемое свойство. Например, у текста - значение строки. Для получения в свою программу вызываем (setq text (_dwgru-property-get (car (entsel)) 'textstring)) и дальше используется уже значение переменной text
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Наконец, нашел время на программу вставки блока с одновременным поворотом, вокруг произвольной оси...
Сама программа, выполнена в формате библиотечной функции: Код:
Код:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 14.02.2009 в 23:31. |
||||
|
||||
Проектировщик СС Регистрация: 24.06.2008
Минск
Сообщений: 134
|
|
|||
|
||||
Проектировщик СС Регистрация: 24.06.2008
Минск
Сообщений: 134
|
|
|||
|
||||
ООО Предприятие "Ирбис" Регистрация: 02.02.2009
Екатеринбург
Сообщений: 45
|
Подскажите в чем проблема:
В свойствах блока, вставляемого из файла, код 10 содержит координаты базовой точки, иначе точку начала координат в СК блока. Вроде так? На скрине показан такой блок с измененными кодами 10, 50 и 210. код 10 блока содержит координаты (10 -129.273 91.8469 0.0), а на рисунке базовая точка находится в точке 0.0 -129.273 91.846. Как такое может быть? До этого у блока менялись коды 50 и 210. Может быть в результате этого произошло смещение СК блока? Заранее спасибо! P.S., догадался, вошел в режим редактирования блока, посомотрел - там все как было, все на месте В общем почему-то координаты точки в группе 10 отображаются со смещением - вместо X показывает Y, вместо Y - Z, соответственно вместо Z - X. Последний раз редактировалось eugen81, 14.02.2009 в 16:48. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Во первых в начале проверь соответствие UCS (ПСК), все dxf коды возвращаються в мировой системе (для перевода используй (trans...)), во вторых, как в твеом случае, у тебя вероятно изменен 210 атрибут, вместо (0 0 1) показывает (1 0 0) - а 210 это простыми словами единичный вектор направления оси Z вхождения блока относительно мировой системы координат, кстати если его изменяешь не обязательно приравнивать к единице автокад и так проглатывает.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
Это не именно "1000", а просто 1000.
Если не нравится 1000, замените на другое число, например 38...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
|
||||
Цитата:
Можно взять отсюда.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,849
|
<...> Удалено
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Конструирование в 3D | Serz | AutoCAD | 87 | 28.10.2014 10:40 |
Lisp Как поставить диаметр отверстия на 3D solidе | P4s8x | LISP | 4 | 06.11.2008 19:31 |
Как тело построенное 3D Face превратить в 3D Solid? | Bdod | AutoCAD | 37 | 03.08.2006 11:36 |
загрузка DOS прог через LISP | Gaa | LISP | 15 | 12.08.2005 19:19 |