Re: ObjectARX. Построение аксонометрий по ГОСТ
Ок, понял. Просто я не встречал, чтобы технологические трубопроводы называли сантехникой, хотя знаком с ними не по наслышке. Наверно так принято в других организациях. Спорить не буду.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → ObjectARX. Построение аксонометрий по ГОСТ
Ок, понял. Просто я не встречал, чтобы технологические трубопроводы называли сантехникой, хотя знаком с ними не по наслышке. Наверно так принято в других организациях. Спорить не буду.
> ShaggyDoc
Насчет создания планов и разрезов в 2D для последующего построения - это тоже неплохая идея. Однако, все это уже будет смахивать на навороченную систему типа MagiCAD :)
> Леонид
Это будет очень популярно. В 2D работают очень многие. И будут продолжать работать, потому что 3D-модель далеко не всегда нужна, хотя иногда очень полезна. Но софт для 3D сложный, дорогой и пока еще несовершенный.
Схемы же к двухмерке ничего не мешает делать трехмерными. С этим справится любая "тетка", не нужен дорогой софт и его наполнение оборудованием и деталями. Но получить вращением схемы "стандартную сантехническую проекцию" нельзя. Да и СПДС требует ее. Впрочем, дело даже не в СПДС, а в том, что "изометрия под 120" очень плохо вписывается в габариты форматов и у нее все равно остаются проблемы с наложением. Даже если она будет узаконена, большинству "сантехников" она не понравится - я уже проводил такие эксперименты.
Преобразование 3М схемы, созданной хоть по 3М-модели, хоть по плоским планам дает независимость и от "десктопов". Такие схемы достаточно просты, так как большая часть вычерчивается ортогонально, кривые и сплайны отсутствуют, в редких случаях (гибкие участки) они все равно могут создаваться отрезками прямых.
Алгоритм трансформации фактически сведется к преобразованию координат части точек с учетом удвоения длины по Y. Списки полученных точек можно обрисовать простыми примитивами, например LINE.
Насчет алгоритма трансформации можно поподробнее? Что вообще будет являться исходными данными - несколько файлов с планами и сечениями? Если нужно перевести только план с вычерченными на нем линиями в аксонометрию, то в данный момент программа уже это делает.
Если я откровенно торможу, то давайте так:
пришлите мне на email образцы исходных файлов, и образец той аксонометрии, что надо получить.
Но софт для 3D сложный, дорогой и пока еще несовершенный.
А что касается несовершенности программ для 3D, здесь я выскажу свое мнение, если Вы не против.
Если программа очень популярна, то это не значит, что она самая совершенная...
Это значит что ее очень хотят продать :)
Нормальные программы для работы с трехмеркой существовали всегда, даже в довиндозовское время в юниксах, и продолжают развиваться до сих пор. Жалко конечно, что про них у нас их мало кто знает...
> Леонид
О хороших программах для 2d тоже не знают.
Выложил обновление.
Теперь можно выбирать примитивы для схемы.
На данный момент из 3D солидов идет обработка только тех, которые содержат линии, то есть например куба или клина.
По идее - цилиндр как должен отобразиться в аксонометрии?..
Два круга и связывающие их две линии, идущие по касательным.
Это задача не такая простая, как отобразить просто линии,
она как раз сейчас у меня в списке задач на первом месте.
Для примера, попробуйте просто по обычному взорвать цилиндр.
Получите просто два круга, а тело цилиндра просто исчезнет,
примерно то же самое происходит и во время выполнения программы.
То же и с конусом, с тором и с другими подобными примитивами.
Думаю, это все решаемо.
Обновление на 29.08 здесь
http://microstation.narod.ru/acad/aks/akspro-0.1.4.zip
Исходники здесь
http://microstation.narod.ru/acad/aks/a … .4-src.zip
Предложения по оптимизации кода принимаются :)
На всякий случай напомню: продажа кому-либо этой программы без исходников нарушает лицензию.
Леонид, заготовка программы замечательная. Но есть нюансы.
1. Аксонометрия строится "наизнанку". На параллелепипеде это незаметно, а если трансформировать отдельную "трубу", сразу бросается в глаза. Имею ввиду то, что у тебя называется "косоугольная фронтальная изометрическая проекция" с отзеркаливанием.
Психологически объясняется тем, что чертят обычно в положительном квадранте осей XY - 0 находится слева внизу, X направлена вправо, Y - вверх. Проекция должна получиться такая же - вектор X вправо, вектор Y - на "северо-восток".
Имея 3D Poly с координатами, например (LISP-список)
( (0.0 0.0 0.0) (10000.0 0.0 0.0) (10000.0 0.0 5000.0) (10000.0 10000.0 5000.0) )
должны получить координаты проекции
( (0.0 0.0) (10000.0 0.0) (10000.0 5000.0) (17071.1 12071.1) )
2. Проекцию лучше делать не в новом чертеже, а запросить указание точки начала "псевдокоординат" проекции в этом же чертеже. В частном случае - тот же 0.
А при расчете трансформированных координат точки передавать аргументом еще и точку начала координат проекции. Или смещать точки на уровне программы.
Окей, посмотрю, что можно сделать.
А есть какие-нибудь нормативы, по которым строятся такие схемы? В ГОСТе таких нет.
> Леонид
Говорю только про строительное черчение. Стандарты СПДС не разжевывают построение "асонометрии под 45", но в них во всех есть примеры схем, где они так и построены. Плюс опыт многих десятилетий, так что у сантехников и вопросов не возникает.
По стандартам чертежи зданий располагаются длинной стороной вдоль длинной стороны формата. И схемы так же чертят. Хотя иногда, для удобства восприятия, схему делают повернутой, но все равно ось Y рисуют с "автокадовским" углом 45 градусов.
А вот мои наброски на LISP.
Для набора:
(defun ru-3d-axonom-selection (/ count selection start_2d_point) (princ "\nВыбор объектов для создания изометрии: \n") (if (setq selection (ssget '((-4 . "<OR") (0 . "LINE") (0 . "POLYLINE") (0 . "LWPOLYLINE") (-4 . "OR>") ) ) ;_ end of ssget ) ;_ end of setq (progn (setq start_2d_point (ru-get-point-reguired "Начало псевдокоординат аксонометрии" nil) count -1 ) ;_ end of setq (repeat (sslength selection) (ru-error-catch (function (lambda () (ru-3d-axonom-ent (ssname selection (setq count (1+ count) ) ;_ end of setq ) ;_ end of ssname start_2d_point ) ;_ end of ru-3d-axonom-ent ) ;_ end of lambda ) ;_ end of function (function (lambda (msg) (princ (strcat "\nСбой создания аксонометрии " ", ОШИБКА: " msg "\n" ) ;_ end of strcat ) ;_ end of princ nil ) ;_ end of lambda ) ;_ end of function ) ;_ end of ru-error-catch ) ;_ end of repeat ) ;_ end of progn ) ;_ end of if (princ) )
Для примитива:
(defun ru-3d-axonom-ent (ent start_2d_point / lst_3d_points) (setq lst_3d_points (ru-pline-list-vertex ent) ) ;_ end of setq (ru-pline-add (mapcar (function (lambda (point) (ru-3d-point-to-ax-point (ru-conv-point-to-3d-point point) start_2d_point) ) ;_ end of lambda ) ;_ end of function (car lst_3d_points) ) ;_ end of mapcar (cadr lst_3d_points) 0 (ru-lw-current) nil ) ;_ end of ru-pline-add )
И трансформация точки
(defun ru-3d-point-to-ax-point (3d_point start_2d_point) ;;; Трансформация 3-мерной точки в точку на плоскости ;;; в "сантехнической аксонометрии" ;;; 3d_point - трехмерная точка ;;; start_2d_point - точка начала условных координат 2-мерной проекции ;;; 0.707107 - cos и sin 45 (list (+ (nth 0 start_2d_point) (nth 0 3d_point) (* (nth 1 3d_point) 0.707107) 0.0) (+ (nth 1 start_2d_point) 0.0 (* (nth 1 3d_point) 0.707107) (nth 2 3d_point)) 0.0 ) ;_ end of list )
Назначение остальных ru-* функций понятно из названий.
Кстати, даже в таком виде программа сразу понравилась, и даже если чертеж вообще сделан на плоскости. Делать аксонометрию даже из 2-м линий со множеством поворотов, компенсаторов или змевиков греющего пола очень нудно, а тут один выбор и одно указание. Полученную заготовку все равно надо дополнять уже внемасштабными символами, поэтому в набор берутся только *LINE.
Спасибо за примеры на LISP, постараюсь в них разобраться, когда будет время, учитывая то, что для меня LISP как для китайца польский :)
На данный момент, думаю, сделаю следующим образом - предоставлю пользователю возможность самому настраивать направлнение осей X и Y на аксонометрической схеме. Можно будет их произвольно вертеть во всех направлениях, в том числе и менять искажение по оси.
> Леонид
Очень неплохая (как для программиста) мысль. Ее очень желательно расширить "предустановками", т.е. набором готовых вариантов, их которых пользователь может выбрать нужный.
> Александр Ривилис
Да, само собой. Усложнять работу пользователя - дело неблагодарное.
Я бы посоветовал сделать AksPro не командой, а функцией с аргументами. Аргументы позволяют работать с "предустановленными" стандартными вариантами, без диалога, начиная с выбора объектов. А одна из комбинаций аргументов (или вызов без аргументов) - диалоговая работа для любителей экспериментов.
Насчет функции не совсем понял. Речь идет о функции для программ LISP?
Вообще, была такая идея - просто сделать на каждый тип аксонометрии свою команду, и еще команду для схемы с последними настройками, а диалоговое окно вызывать тоже по команде, как окно опций. Наверно, к такому варианту все и придет. Уж больно много настроек в перспективе намечается, тяжеловато для стартового дилога.
> Леонид
То, о чем написал уважаемый ShaggyDoc можно реализовать в одной и той же функции, если определить ее в ObjectARX Wizard (которым Вы уже воспользовались) не через ARX commands, а через ADS symbols & commands, задав ей имя C:ASKPRO. Тогда если введена команда AKSPRO, то можно показать диалоговое окно и все спросить у пользователя, а если выполнен запуск функции C:ASKPRO, то ей можно передать параметры. В отличие от lisp-функций количество аргументов функции (и соответственно параметров, которые ей передаются) может быть переменным:
(C:AKSPRO [<param1>] [<param2>] ... [<paramN>])
Функция примет переданные параметры используя функцию acedGetArgs() и все сделает сама молча без лишних запросов или запросит только то, что ей не передано в параметрах. Причем какие-то параметры можно сделать необязательными и они получат значения по умолчанию. Осталось продумать список параметров, описать их для пользователя и в бой! Желаю успеха.
Да, интересная тема. Попробую.
Век живи, век учись!
Програмка класная. Огромное спасибо!
У меня есть предложение. А именно:
Добавить флажок Поддерживать свойства примитивов. Т. е. сделать так что веса, цвет и масштаб линий сохранялись на созданной аксонометрии.
Объясню для чего это нужно. К примеру в 3D вычерчена большая спринклерная система, а это куча переходов диаметра труб от начала рядка спринклеров к концу. Я к примеру для подсчёта длинны труб и последующего образмеривания с помощью лисп-програмки черчу их различными весами линий, а также для каждого направления задаю свой цвет.
Если примитивы имеют цвет ByLayer то брать цвет соответсвующего слоя. Ну или вообще "экстра" в виде флажока Поддерживать слои.
Забыл сказать самое главное. Что это нужно для упрощения дальнейшего образмеривания диаметров труб и др. и вообще так будет легче ориентироваться если схема сложная. Хотя это и так понятно. В моём случае количество спринклеров может исчисляться тысячами, а переходы диаметров сотнями.
Ещё раз спасибо! :)
> Fantomas
Окей, добавил в список задач.
Новая версия здесь
http://microstation.nm.ru/acad/aks/akspro-0.2.1.zip
добавлены две функции
(C:AKSPRO ...) и (C:AKSSEL ...)
аргументы - тип аксонометрии (0-4) или углы осей аксонометрии
например
(C:AKSPRO 1)
будет выполнена отрисовка аконометрии по пункту 1.2 ГОСТа
(C:AKSSEL 0 44.5 90)
будет выполнена отрисовка по осям аксонометрии X - 0?, Y - 44.5?, Z - 90
http://microstation.nm.ru/acad/aks/akspro-0.2.2.zip
Добавлено сохранение в аксонометрии свойств элементов - толщина, цвет и т.д.
http://microstation.narod.ru/acad/aks/akspro-0.2.3.zip
Теперь цилиндры и конусы (тела) рисуются полностью.
Форумы CADUser → Программирование → ObjectARX → ObjectARX. Построение аксонометрий по ГОСТ
Форум работает на PunBB, при поддержке Informer Technologies, Inc