Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Классный лисп - xpipe! До сего момента делал все вручную.
Для законченности трубопровода (сделанного из линий) в узлах перегиба вставлял шары. Т.е. трубопровод получался "цельным". Можно ли этот момент как-то автоматизировать в пределах этого лиспа или другим лиспом?
Или есть на этот счет другое мнение?
P.S. Даже если решения не будет, этот лисп ускорит мою работу КРАТНО. Огромное спасибо!

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Кстати, возможно ли сделать цилиндр из направляющих ЛИНИЙ так же, как из полилиний - чтобы труба цельная была?
Вот это было бы решение!

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

трубопроводы одного диаметра должны быть в отдельном слое. Погасить остальные слои, набрать в командной строке _massprop или нажать соответствующую кнопку, выделить все трубопроводы нажать Enter. В появившемся окне Volume: = объем всех труб. Раздели эту цифру на площадь сечения трубы - получишь длину.

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

www.ustation.ru/artides/stat02.html

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

www.ustation.ru/articles/stat02.html

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Ну и зачем мне другая программа?
Я же про работу в AutoCAD спрашиваю.

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

А как же с липсом для расчета длин труб в уже нарисованных вайлах? Че - то получается?

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Denver 22
Если хочешь, то есть другой путь..
1.По точкам или произвольно рисуешь полилинию (кстати для этого есть липс в разделе готовые программы)
2. С помошью команды _explode взрываешь полилинию.
3. С помошью команды _fillet задаешь радиус закругления будующих отводов (например: отвод 2R и диаметр тода трубы указываешь в команде _fillet/r)
4. На всех ломанных точках изменения направления полилинии с помошью команды _fillet делаешь изгибы заданного радиуса
5. Используешь вышеизложенный липс
6. С помошью команды _Union объединяешь трубы и отбоды в одну трубу
Надеюсь объяснение не слишком замороченное...

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Чертяка
Взял трубопроводы одного диаметра в отдельном слое. Погасил остальные слои, набрал в командной строке _massprop , выделил все трубопроводы, нажал Enter. В появившемся окне Volume: = объем всех труб. Разделил эту цифру на площадь сечения трубы — получил длину труб в 26,283 от реальной 99,48 метров....

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Посмотрите в https://www.caduser.ru/forum/topic26337.html

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Виталий
Спасибо огромное!!! Получилось просто превосходно. Как я и хотел. И решение ведь простое - но насчет 2R я бы не скоро догадался!
Понятно, что при необходимости редактирования труб колена буду убирать, трубы удлинять до соприкосновения (при необходимости). Но все это вполне реально!
Еще раз спасибо, Виталий.

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Виталий
Дайте пожалуйста ссылку на упомянутый лисп для отрисовки полилинии. Не могу найти. Чем-то он видимо отличается от простого рисования полилинии.

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Denver 22
Это, да простит меня автор, липс, которым я строю 3D полилинии:

; Команда построения 3-х мерной полилинии с дополнительными опциями управления текущей ПСК.
; Перед указанием каждой следующей вершины полилинии имеется возможность установить желаемую ориентацию осей ПСК.
; Опции командной строки похожи на опции команды UCS, но имеются особенности:
; 1. Точка начала ПСК всегда переносится в последнюю построенную вершину полилинии.
;    Все изменения ПСК с помощью доступных опций касаются только направления её осей X и Y.
;    Точка начала ПСК остается неизменной. Это позволяет задавать координаты вершин (кроме первой)
;    с командной строки в абсолютных координатах (не используя @).
; 2. Oпция Above.
;    Запрашивает смещение следующей вершины относительно последней построенной вдоль оси Z ПСК.
;    Строит новую вершину и переносит в неё ПСК.
; 3. Опция ZDepth.
;    Запрашивает смещение ПСК вдоль оси Z относительно последней вершины, переносит ПСК, но вершину не строит,
;    а ждет указания точки уже в новой плоскости построений.
; 4. Опция Prev.
;    Ориентирует оси текущей ПСК в соответствии с ориентацией осей ближайшей ПСК из списка отката, у которой
;    направление осей не совпадает с текущим. Начало текущей ПСК остается неизменным.
; Загружать весь файл.
; Вызов с командной строки: 3DPLINE
;
;
(defun c:3dpline ( /
      read-ucs; локальная функция.
      ucs; список — состояние ПСК на момент вызова команды.
      icon; текущее состояние системной переменной UCSICON.
      )
  ; Определение локальной функции:
  (defun read-ucs ( / org)
    (setq org (getvar 'ucsorg))
    (list org
    (mapcar '+ (getvar 'ucsxdir) org)
    (mapcar '+ (getvar 'ucsydir) org)
    ); return.
  ); end defun.
  ;
  (begin-undo-group 0)
  ;
  (setq icon (getvar 'ucsicon))
  (setq ucs (read-ucs))
  ;
  (vl-catch-all-apply 'brokenline)
  ;
  ; Восстановление исходной ПСК и видимости пиктограммы:
  (setvar 'ucsicon 0)
  (command "_.ucs" "_World" "_.ucs" "_3point" (car ucs) (cadr ucs) (caddr ucs))
  (setvar 'ucsicon icon)
  ;
  (end-undo-group)
  (princ)
); end defun.
; BROKENLINE.
; Внешняя функция: READ-UCS.
; Внешняя переменная: icon — состояние системной переменной UCSICON на момент вызова команды.
; Переменная уровня документа: ::model_space — указатель пространства модели.
(defun brokenline ( /
       pt; результат запроса точки.
       brol; vla-указатель.
       disp; смещение начала ПСК.
       nullbase; точка (0.0 0.0 0.0).
       org; точка начала ПСК.
       act; список с информацией о последнем действии пользователя.
       actions; список действий.
       coords; список координат построенной полилинии.
       )
  (setq nullbase '(0.0 0.0 0.0))
  (if (not ::model_space) (setq ::model_space (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))));
  ;
  (initget "eXit")
  (setq pt (getpoint "\nSpecify first vertex or [eXit] <exit>: "))
  (if (or (not pt) (= pt "eXit")) (quit));
  (setq actions (append (list (cons nil (read-ucs))) actions))
  (command "_.ucs" "_Origin" pt)
  (while pt
    (initget 0 "Above ZDepth Top Bottom Front BAck Left Right X Y Z Prev Undo")
    (setq pt (getpoint
         nullbase
         "\nSpecify next vertex or [Above/ZDepth/Top/Bottom/Front/BAck/Left/Right/X/Y/Z/Prev/Undo] <exit>: "
       )
    ); setq.
    (cond
      ((not pt)); конец построений.
      ((listp pt); указана точка:
       (cond
   (brol; добавляем новую вершину:
    (setq actions (append (list (cons T (read-ucs))) actions))
    (command "_.ucs" "_Origin" pt)
    (vlax-invoke-method brol 'AppendVertex (vlax-3d-point (trans nullbase 1 0)))
    (vlax-invoke-method brol 'update)
    );
   (T; создаем полилинию из 2х вершин:
    (setq brol (vlax-invoke-method
           ::model_space
           'Add3Dpoly
           (vlax-make-variant
       (vlax-safearray-fill
         (vlax-make-safearray vlax-vbdouble '(0 . 5))
         (append (trans nullbase 1 0) (trans pt 1 0))
         )
       (+ vlax-vbarray vlax-vbdouble)
       );
           );
    ); setq.
    (setq actions (append (list (cons T (read-ucs))) actions))
    (command "_.ucs" "_Origin" pt)
   );
       ); end cond.
      );
      ((= pt "ZDepth"); указание на смещение ПСК вдоль оси Z:
       (setq disp nil)
       (while (not disp)
   (initget 128)
   (setq disp (getpoint "\nSpecify Z-elevation for new UCS origin: "))
   (cond
     ((not disp) (princ "\nInvalid input. Please retry.")); пустой ввод. Повтор.
     ((listp disp) (setq disp (caddr disp)));
     ((numberp (setq disp (atof disp))));
     (T (princ "\nInvalid input. Please retry.") (setq disp nil));
     ); end cond.
   ); end while.
       (setq actions (append (list (cons nil (read-ucs))) actions))
       (command "_.ucs" "_Move" "_Zdepth" disp)
      );
      ((= pt "Above"); указание на построение следующей вершины смещением предыдущей по оси Z:
       (setq disp nil)
       (while (not disp)
   (initget 128)
   (setq disp (getpoint "Specify Z-elevation for next vertex: "))
   (cond
     ((not disp) (princ "\nInvalid input. Please retry.")); пустой ввод. Повтор.
     ((listp disp) (setq disp (caddr disp)));
     ((numberp (setq disp (atof disp))));
     (T (princ "\nInvalid input. Please retry.") (setq disp nil));
     ); end cond.
   ); end while.
       (setq actions (append (list (cons T (read-ucs))) actions))
       (command "_.ucs" "_Origin" (setq pt (list 0.0 0.0 disp)))
       (vlax-invoke-method brol 'AppendVertex (vlax-3d-point (trans nullbase 1 0)))
       (vlax-invoke-method brol 'update)
      );
      ((wcmatch pt "[XYZ]"); поворот вокруг оси:
       (setq ang (getreal (strcat "\nSpecify rotation angle about " pt " axis <0.0>: ")))
       (cond
   (ang
    (setq actions (append (list (cons nil (read-ucs))) actions))
    (command "_.ucs" (strcat "_" pt) ang)
   );
       ); end cond.
      );
      ((or (wcmatch (substr pt 1 1) "[TBFLRW]") (= pt "BAck"))
       (setq actions (append (list (cons nil (read-ucs))) actions))
       (setq org (getvar 'ucsorg))
       (setvar 'ucsicon 0)
       (command "_.ucs" (strcat "_" pt))
       (setq org (trans org 0 1))
       (command "_.ucs" "_Origin" org)
       (setvar 'ucsicon icon)
      );
      ((= pt "Prev")
       (setq pt 0)
       (setq act (car actions))
       (while (and act (equal
       (list (getvar 'ucsxdir) (getvar 'ucsydir))
       (list (mapcar '- (caddr act) (cadr act)) (mapcar '- (cadddr act) (cadr act)))
       1e-9; точность сравнения.
           );
        ); and.
   (setq pt (1+ pt))
   (setq act (nth pt actions))
       ); end while.
       (cond
   (act; найдена ПСК в списке отката, которая отличается от текущей:
    (setq org (getvar 'ucsorg))
    (setq actions (append (list (cons nil (read-ucs))) actions))
    (setvar 'ucsicon 0)
    (command "_.ucs" "_World" "_.ucs" "_3point" (cadr act) (caddr act) (cadddr act))
    (setq org (trans org 0 1))
    (command "_.ucs" "_Origin" org)
    (setvar 'ucsicon icon)
   );
   (T (princ "All previous UCSs not differs from current UCS."));
       ); end cond.
      );
      ((= pt "Undo"); отмена последнего действия:
       (setq act (car actions)); последнее зафиксированное действие.
       (setq actions (cdr actions))
       (cond
   ((car act); последним действием была добавлена вершина полилинии:
    (setq coords (reverse (vlax-safearray->list (vlax-variant-value (vlax-get-property brol 'coordinates)))))
    (cond
      ((= (length coords) 6); полилиния из oдного сегмента:
       (vlax-invoke-method brol 'delete)
       (vlax-release-object brol)
       (setq brol nil)
      );
      (T; полилиния из 2х и более сегментов:
       (vlax-invoke-method brol 'delete)
       (vlax-release-object brol)
       (setq coords (reverse (cdddr coords)))
       (setq brol (vlax-invoke-method
        ::model_space
        'Add3Dpoly
        (vlax-make-variant
          (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length coords)))) coords)
          (+ vlax-vbarray vlax-vbdouble)
        );
      );
       ); setq.
      );
    ); end cond.
    (setvar 'ucsicon 0)
    (command "_.ucs" "_World" "_.ucs" "_3point" (cadr act) (caddr act) (cadddr act))
    (setvar 'ucsicon icon)
   );
   (actions; изменялась только ПСК и список отката не пустой:
    (setvar 'ucsicon 0)
    (command "_.ucs" "_World" "_.ucs" "_3point" (cadr act) (caddr act) (cadddr act))
    (setvar 'ucsicon icon)
   );
   (T
    (setvar 'ucsicon 0)
    (command "_.ucs" "_World" "_.ucs" "_3point" (cadr act) (caddr act) (cadddr act))
    (setvar 'ucsicon icon)
    (initget "eXit")
    (setq pt (getpoint "\nSpecify first vertex or [eXit] <exit>: "))
    (if (or (not pt) (= pt "eXit")) (quit));
    (setq actions (append (list (cons nil (read-ucs))) actions))
    (command "_.ucs" "_Origin" pt)
   );
       ); end cond.
      );
    ); end cond.
  ); end while.
  (princ)
); end defun.
; BEGIN-UNDO-GROUP.
; Установка отметки начала группы команд.
; Возврат: набор объектов предварительного выбора или nil.
(defun begin-undo-group (mode; режим обработки набора предварительно выбранных объектов.
       /
       undo_state; текущая настройка команды UNDO.
       ss; набор объектов предварительного выбора.
       )
  (cond
    ((= mode 0) (sssetfirst nil nil)); не разрешен предварительный выбор.
    ((= mode 1); команда может использовать набор предварительного выбора:
     (if (and (setq ss (ssget "_I")) (= 0 (getvar 'pickfirst))) (sssetfirst nil nil)); end if.
    );
    ((= mode 2); функция не меняет набор предварительного выбора:
     (setq ss (ssget "_I"))
    );
  ); end cond.
  ;
  (setq undo_state (getvar 'undoctl))
  (setvar 'cmdecho 0)
  (cond
    ((= 0 (logand undo_state 1)) (command "_.undo" "_All")); если отключена возможность отмены.
    ((= 2 (logand undo_state 2)) (command "_.undo" "_control" "_all")); если запрещена отмена более одной команды.
  ); end cond.
  (if (= 0 (logand undo_state 8)) (command "_.undo" "_begin")); если нет открытой группы команд.
  (if (and (= mode 2) ss) (sssetfirst nil ss))
  ss; return.
); end defun.
; END-UNDO-GROUP.
; Установка отметки окончания группы команд.
; Возврат: nil.
(defun end-undo-group ( / )
  (setvar 'cmdecho 0)
  (if (= 8 (logand (getvar 'undoctl) 8))(command "_.undo" "_end")); end if.
); end defun.

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Denver 22
Makpoc для кнопки
^C^C^P(if (not C:3dpline) (load "3dpline")) 3dpline

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Люди добрые!!!
Помогите программкой для расчета длин труб в уже нарисованных вайлах!!!
Ну очень, очень нужно

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Vitaliy
Надеюсь Вам этот лисп подойдет - я полностью им доволен:
(vl-load-com)
(defun entLen1 (/ set:entities      int:allEntities
            int:curveEntities int:l         rea:length
         )
  (if (not (setq set:entities (cadr (ssgetfirst))))    ; Этот if добавлен для
    (setq set:entities (ssget))            ; обработки предварительного
  ) ;_ if                  ; выбора примитивов
  (if set:entities
    (progn
      (setq int:allEntities
        (sslength set:entities)   ; количество выбранных примитивов
       int:curveEntities
        0            ; счетчик линейных примитивов
       int:l 0         ; счетчик
       rea:length
        0.0         ; общая длина линейных примитивов
      ) ;_  setq
      (while (< int:l (sslength set:entities))
   (if
     (not
       (vl-catch-all-error-p
         (vl-catch-all-apply
      'vlax-curve-getStartPoint
      (list
        (vlax-ename->vla-object (ssname set:entities int:l))
      ) ;_ list
         ) ;_  vl-catch-all-apply
       ) ;_  vl-catch-all-error-p
     ) ;_  not
      (setq int:curveEntities (1+ int:curveEntities)
       rea:length      (+ rea:length
                  (vlax-curve-getDistAtParam
               (vlax-ename->vla-object
                 (ssname set:entities int:l)
               ) ;_ vlax-ename->vla-object
               (vlax-curve-getEndParam
                 (ssname set:entities int:l)
               ) ;_ vlax-curve-getEndParam
                  ) ;_  vlax-curve-getDistAtParam
               ) ;_  +
      ) ;_  setq
   ) ;_  if
   (setq int:l (1+ int:l))
      ) ;_  while
      (princ (strcat "\n Выбрано примитивов: "
           (itoa int:allEntities)
           ", из них линейных: "
           (itoa int:curveEntities)
           "\n Общая длина линейных примитивов: "
           (rtos rea:length)
        ) ;_ strcat
      ) ;_ princ
    ) ;_  progn
    (alert "Примитивы не выбраны!")
  ) ;_  if
  (prin1)
) ;_  defun
Да, это не совсем по теме, но подскажите кто-нибудь как настраивать макросы и как ими пользоваться?

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Только что задумался, если длины именно труб, то я пас. Этот лисп вычисляет длину отрезков, и прочих примитивов.

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Ресомендую перейти к обсуждению этой темы на
https://www.caduser.ru/forum/topic26337.html
пробывал выложенные программки, и похоже они работают, покрайней мере уже близко к решению, благодаря Олегу..

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Denver 22
Класный липс, но он похоже лучше годится для 2D чертежей - сумма линий и полилиний..

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Найдено решение на
https://www.caduser.ru/forum/topic26337.html
Можно считать, что тема закрыта, если конечно кто-нибудь не сможет улучшить уже написанную там прогу...

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

Есть возможность бесплатно принять участие в тестировании демоверсии программы проектирования трубопроводов и трубопроводных систем.
Кому это интересно, то пишите... с пометкой "Тестирование".

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> Smirnoff
Замечательно. Чудесная вещь. Нет слов. Насколько можно быстро сделать 3д каркас - просто обалдеть.
(как это было в фильме "Иван Васильевич меняет профессию" - "А стену в магазин Ваша машина то же может убрать? Замечательное изобретение, замечательное..."
А насколько сложно вместо запроса на диаметр окружности использовать запрос на другую форму для выдавливания, например двутавр, швеллер, уголок или просто замкнутую полилинию ? С возможностью ручного выбора заранее нарисованной формы ?  И на фиг Ревит для нас нужен не будет...

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> PL
Q_EXTRUDE (hppt://geol-dh.ru/kai_stru.html, там и картинка есть)
Все что вы хотели + вставка сечения перпендикулярно к текущей UCS или пути + только вставка сечений (без выдавливания).

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> KAI
Возможно ли скачать Q_EXTRUDE не загружая весь комплекс KAI-2001 ? На работе довольно жесткая политика-никаких глобальных сторонних программ(возможны неприятности)
Был бы очень благодарен.

Re: LISP. Быстрая отрисовка 3D трубопроводов (экструдирование)

> PL
Это возможно. Однако со свободным временем сейчас не очень хорошо.