| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как преобразовать тела BODY в тела 3DSOLID после экспорта из Revit в AutoCAD

Как преобразовать тела BODY в тела 3DSOLID после экспорта из Revit в AutoCAD

Ответ
Поиск в этой теме
Непрочитано 03.11.2017, 21:19 #1
Как преобразовать тела BODY в тела 3DSOLID после экспорта из Revit в AutoCAD
Setvar
 
Москва
Регистрация: 10.02.2007
Сообщений: 611

Представляю фрагмент чертежа, являющийся результатом экспорта из Revit в AutoCAD. В файле присутствует объект BODY, который можно интерпретировать как стену и еще 2 объекта BODY, которые можно интерпретировать как трубы. Задача состоит в том, чтобы получить отверстие в стене в месте пересечения её трубами. Взаимодеqствие объектов BODY AutoCAD не обрабатывает. Поэтому для решения задачи я составил две программы преобразования тел BODY в тела 3DSOLID.
Первая обрабатывает BODY, которые представляются как стены.
Код:
Код:
[Выделить все]
(defun C:B-3DS-ST ( / fct bss lbss n m ent)
(setq fct (getvar "FACETERSMOOTHLEV"))
(setvar "FACETERSMOOTHLEV" 0)
(princ "\nВыберите объеты: ")
(setq bss (ssget))
(if bss
    (progn
    (setq lbss (sslength bss) n 0 m 0)
    (repeat lbss
            (setq ent (ssname bss n))
            (if (= (cdr (assoc 0 (entget ent))) "BODY")
                (progn
                (vl-cmdf "_CONVTOSURFACE" ent "")
                (vl-cmdf "_EXPLODE" "_L")
                (vl-cmdf "_SURFSCULPT" "_P" "")
                (setq m (+ m 1))
                ) ; progn
             ) ; if
             (setq n (+ n 1))
    ) ; repeat
    (princ "\nПреобразовано ") (princ m) (princ " тел BODY в 3DSOLID.")
    ) ; progn
    (princ "\nНичего не выбрано.")
) ; if
(setvar "FACETERSMOOTHLEV" fct)
(princ)
)
Вторая обрабатывает BODY, представляемые как трубы.
Код:
Код:
[Выделить все]
(defun C:B-3DS-TR ( / fct bss lbss n m ent)
(setq fct (getvar "FACETERSMOOTHLEV"))
(setvar "FACETERSMOOTHLEV" 0)
(princ "\nВыберите объеты: ")
(setq bss (ssget))
(if bss
    (progn
    (setq lbss (sslength bss) n 0 m 0)
    (repeat lbss
            (setq ent (ssname bss n))
            (if (= (cdr (assoc 0 (entget ent))) "BODY")
                (progn
                (vl-cmdf "_CONVTOSURFACE" ent "")
                (vl-cmdf "__Thicken" "_L" "" "1")
                (setq m (+ m 1))
                ) ; progn
             ) ; if
             (setq n (+ n 1))
    ) ; repeat
    (princ "\nПреобразовано ") (princ m) (princ " тел BODY в 3DSOLID.")
    ) ; progn
    (princ "\nНичего не выбрано.")
) ; if
(setvar "FACETERSMOOTHLEV" fct)
(princ)
)
Это очень неудобно. Можно ли раскопать какую-нибудь разницу в этих двух BODY, чтобы использовать 1 программу с внутренним разветвлением после выбора объектов в соответствии с этим гипотетически различием?

----- добавлено через ~4 мин. -----
Решение предлагается такое:
Код:
[Выделить все]
(defun C:B-3DS ( / echo fct bss lbss n m ent)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq fct (getvar "FACETERSMOOTHLEV"))
(setvar "FACETERSMOOTHLEV" 0)
(princ "\nВыберите объеты: ")
(setq bss (ssget (list (cons 0  "BODY"))))
(if bss
    (progn
    (setq lbss (sslength bss) n 0 m 0)
    (repeat lbss
            (setq ent (ssname bss n))
            (if (= (cdr (assoc 0 (entget ent))) "BODY")
                (progn
                (vl-cmdf "_CONVTOSURFACE" ent "")
                (vl-cmdf "__Thicken" "_L" "" "1")
                (setq ent (entlast))
                (if (=  (cdr (assoc 0 (entget ent))) "SURFACE")
                    (progn
                    (vl-cmdf "_EXPLODE" "_L")
                    (vl-cmdf "_SURFSCULPT" "_P" "")
                    ) ; progn
                ) ; if
                (setq m (+ m 1))
                ) ; progn
            ) ; if
            (setq n (+ n 1))
    ) ; repeat
    (princ "\nПреобразовано ") (princ m) (princ " тел BODY в 3DSOLID.")
    ) ; progn
    (princ "\nНичего не выбрано.")
) ; if
(setvar "CMDECHO" echo)
(setvar "FACETERSMOOTHLEV" fct)
(princ)
)
Не очень красивое решение, но работает, правда, относительно долго при большом числе BODY в чертеже. Надо хладнокровно подождать.

Вложения
Тип файла: dwg
DWG 2013
Труба BODY и стена BODY.dwg (55.2 Кб, 13 просмотров)


Последний раз редактировалось Setvar, 04.11.2017 в 07:53. Причина: Уточнение
Просмотров: 2810
 
Непрочитано 04.11.2017, 08:05
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


С очевидного, они в разных слоях и разного цвета =о)

Из не очевидного, у этих объектов разная структура XDATA.

Хотя данных для однозначного вывода маловато, нужно экспериментировать.

ЗЫ.
А зачем эти манипуляции производить в автокаде, почему нельзя это сделать в самом ревите?
Boxa на форуме  
 
Автор темы   Непрочитано 04.11.2017, 09:25
#3
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Слои и цвета могут быть достаточно произвольными и подчас слои могут иметь маловразумительные названия. Я и хочу сделать программу, инвариантную по отношению к слоям и цветам.
Цитата:
Сообщение от Boxa Посмотреть сообщение
А зачем эти манипуляции производить в автокаде, почему нельзя это сделать в самом ревите?
Дело в том, что нет людей
а) уверенно работающих в Revit (проектировщики фактически на стадии освоения);
б) могущих программировать в среде Revit.
Я здесь описал только часть проблемы, но руководству приспичило, чтобы проектная документация по инженерным сетям выполнялась в Revit (якобы так требует заказчик). В AutoCAD MEP все давно уже мной решено, а с Revit я пока не очень дружу.
Setvar вне форума  
 
Непрочитано 06.10.2018, 23:13
#4
ivp


 
Регистрация: 02.11.2007
Тольятти
Сообщений: 9


Подскажите пожалуйста почему скрипты не работают в ACAD 2007 ? Ругается на переменную:

>Command: properties
>Command: b-3ds-st
>; error: AutoCAD variable setting rejected: "FACETERSMOOTHLEV" 0
ivp вне форума  
 
Непрочитано 07.10.2018, 08:54
1 | #5
Кулик Алексей aka kpblc
Moderator

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


Возможно, 2007 не знает такой системной переменной.
Offtop: ИМХО - лиспы надо переделывать для корректной работы в любых (или почти любых) условиях...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.10.2018, 09:33
#6
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Setvar Посмотреть сообщение
Я и хочу сделать программу, инвариантную по отношению к слоям и цветам.
Я думаю Вы уже разобрались в чем дело и как фильтровать, но на будущее все таки оставлю тут ссылку: http://adndevblog.typepad.com/aec/20...ata-xdata.html

ЗЫ.
Буквально пару недель назад, смотрел чертежи полученные экспортом из ревита и загнанные в один слой и в один цвет кем то из исполнителей.
Зачем это было сделано, для меня загадка, но с помощью вышеприведенной ссылки удалось все разложить по слоям, цветам и типам.

Последний раз редактировалось Boxa, 07.10.2018 в 09:44.
Boxa на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как преобразовать тела BODY в тела 3DSOLID после экспорта из Revit в AutoCAD

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать в число сразу множество ячеек excel 2010 eugenmax Прочее. Программное обеспечение 26 06.08.2014 11:04
Как Преобразовать объектные ссылки в текст zmejsan AutoCAD 6 29.11.2013 15:09
Как преобразовать привязанные растры MapInfo в привязанные растры Autocad? ingenerus AutoCAD 1 28.03.2012 14:39
Преобразовать в блок MorganSpb Динамические блоки 18 02.12.2008 14:00
Solid и Body {Smirnoff} AutoCAD 5 10.01.2006 12:45