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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Преобразование объемных тел в стрежни

Преобразование объемных тел в стрежни

Ответ
Поиск в этой теме
Непрочитано 03.08.2012, 18:11 #1
Преобразование объемных тел в стрежни
proteirei
 
Регистрация: 17.04.2008
Сообщений: 154

Задача: есть 2000 параллелепипедов исполняющих роль труб квадратного сечения. Нужно на базе этой коснтрукции получить расчетную схему для СКАДа.

Есть ли какой-то способ быстро преобразовать эти "кубики" в стерженьки (пересечение в узлах было бы желательно, но не обязательно). Какие вообще есть варианты преобразования 3Д тел в стежневые элементы?

Добавлено:
Судя по количеству ответов за полдня я или не в сезон спросил, или нет такого решения.

Последний раз редактировалось proteirei, 03.08.2012 в 23:18.
Просмотров: 2397
 
Непрочитано 06.08.2012, 10:06
#2
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 824


proteirei, Попробуй командой flatten из Express.
Astartes вне форума  
 
Непрочитано 06.08.2012, 10:29
#3
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


с телами ничего не получится, только вручную провести оси труб линиями...
для разрыва линий в местах их пересечений использовать программу LISP. Разорвать объекты в точках пересечения. BreakObjects.
Хмурый вне форума  
 
Непрочитано 06.08.2012, 10:37
#4
Дима_

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


надо посмотреть на эти паралепипеды (как они сделанны) - если созданны _box'ом а затем размноженны - то вытщаить координаты из истории можно (ну и соответственно построить).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 06.08.2012, 10:47
#5
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 824


Там насколько я понял идет речь о "кубиках". Кубики командой флаттен прекрасно преобразуются в линии. Потом можно найти на форуме команду, которая строит осевую между двумя линиями. Все полегче, чем вручную рисовать.
Astartes вне форума  
 
Непрочитано 06.08.2012, 11:24
#6
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


Цитата:
Сообщение от Дима_ Посмотреть сообщение
надо посмотреть на эти паралепипеды (как они сделанны) - если созданны _box'ом а затем размноженны - то вытщаить координаты из истории можно (ну и соответственно построить).
если они наклонные- то ничего не выйдет
Хмурый вне форума  
 
Автор темы   Непрочитано 06.08.2012, 12:23
#7
proteirei


 
Регистрация: 17.04.2008
Сообщений: 154


Цитата:
Сообщение от Хмурый Посмотреть сообщение
если они наклонные- то ничего не выйдет
Да, они наклонные.
Сделаны преимущественно боксами, есть отдельные места сделаные вытягиванием вдоль траектории.
proteirei вне форума  
 
Непрочитано 06.08.2012, 12:23
#8
Дима_

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


То Хмурый - если это "ящики" то из "истории" можно вытащить длинну и ширину и через centroid и getboundingbox вычислить координаты.
з.ы. Кстати через .Net лекго вытащить угловые точки 3D тела через GetGripPoints - автор давай пример и версию акада.
з.з.ы Задача оказалась интересной (но т.к. автор пример так и не выложил, подходит-ли решение к данной задаче??), ведь с програмной обработкой з-х мерки у автокада туго:
В общем работает с созданными любыми способами трубами с КВАДРАТНЫМ (не прямоугольным) сечением и длинна трубы должна превышать сторону. В архиве "кино" и скомпилированная под Acad 2010 .Net библиотека (других версий сейчас нет - так что компилируйте сами). Запускать box->cyl.
Код:
[Выделить все]
 ;;;;;;;;;;; Для работы НЕОБХОДИМА загруженная getgrips.dll
(vl-load-com)
(defun c:box->cyl()
  ((lambda (doc)
     ((lambda (make-cyl find-v-box model lst-grp)
        (vla-startundomark doc)
        (mapcar '(lambda (lst)
                   (if (= (length lst) 8)
                       (vl-catch-all-apply 'make-cyl (find-v-box lst))))
                lst-grp)
        (vla-endundomark doc))
      (lambda (v1 v2 v3 v4 v5);make-cyl создает цилиндр по четырем точка основания квадратной призмы (v1-v4) и точки высоты (v5)- диогональ к v1.
        (if (and (equal (distance v1 v2) (distance v2 v3) 0.001)
                 (equal (distance v2 v3) (distance v3 v4) 0.001))
            (vla-transformby 
              (vla-addcylinder model
                               (vlax-3d-point '(0 0 0))
                               (/ (distance v1 v2) 2.0)
                               (distance v3 v5))
              (get-ucs-matrix (mapcar '(lambda (a b) (/ (+ a b) 2.0)) v1 v5)
                              (getvektor v1 v2)
                              (getvektor v1 v4)
                              T T))))
      (lambda (lst);find-v-box ищет в точках КВАДРАТНОЙ призмы, точки основания и высоту - диогональ через центр к 1 точке
        ((lambda (sort-len-first)
           ((lambda (lst-s)
              (list (car lst);v1
                    (car lst-s);v2
                    (car (sort-len-first < (cdr lst-s)));v3
                    (cadr lst-s);v4
                    (car (sort-len-first > lst))));v5
            (sort-len-first < lst)))            
         (lambda (op lst);sort-len-first
           (mapcar 'cdr (vl-sort (mapcar '(lambda (x) (cons (distance (car lst) x) x))(cdr lst))
                                 '(lambda (a b) (op (car a) (car b))))))))
      (vla-get-modelspace doc)
      (mapcar 'getgrips (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "3DSOLID")))))))))
   (vla-get-activedocument(vlax-get-acad-object))))

(defun getvektor (pt1 pt2 / tmp); единичный вектор направления заданный точками pt1 pt2.
  (setq tmp (mapcar '- pt1 pt2))
  (if (not (equal tmp '(0.0 0.0 0.0)))
      (mapcar '(lambda (x) (/ (float x) (apply 'max (mapcar 'abs tmp)))) tmp)
      );end of if
  );end of getvektor
(defun get-ucs-matrix (org; начало координат ПСК.
                       xdir; направление оси X ПСК.
                       ydir; направление оси Y ПСК.
                       right; вращение ПСК: T- правое или nil левое
                       direct; флаг получения T- прямой или nil- обратной матрицы.
                       /
                       x y z;
                       leng;
                       l1 m1 n1;
                       l2 m2 n2;
                       l3 m3 n3;
                       )
  (setq x (car org) y (cadr org) z (caddr org))
  (setq leng (distance '(0.0 0.0 0.0) xdir))
  (setq l1 (/ (car xdir) leng) m1 (/ (cadr xdir) leng) n1 (/ (caddr xdir) leng))
  (setq leng (distance '(0.0 0.0 0.0) ydir))
  (setq l2 (/ (car ydir) leng) m2 (/ (cadr ydir) leng) n2 (/ (caddr ydir) leng))
  (if right
      (setq l3 (- (* m1 n2) (* n1 m2))
            m3 (- (* n1 l2) (* l1 n2))
            n3 (- (* l1 m2) (* m1 l2))
            ); setq.
      (setq l3 (- (* m2 n1) (* n2 m1))
            m3 (- (* n2 l1) (* l2 n1))
            n3 (- (* l2 m1) (* m2 l1))
            ); setq.
      ); end if.
  (if direct
      (vlax-tmatrix (list (list l1 l2 l3 x) (list m1 m2 m3 y) (list n1 n2 n3 z) (list 0.0 0.0 0.0 1.0)))
      (vlax-tmatrix (list
                     (list l1 m1 n1 (- (+ (* l1 x) (* m1 y) (* n1 z))))
                     (list l2 m2 n2 (- (+ (* l2 x) (* m2 y) (* n2 z))))
                     (list l3 m3 n3 (- (+ (* l3 x) (* m3 y) (* n3 z))))
                     (list 0.0 0.0 0.0 1.0)
                     ); list.
                    ); vlax-tmatrix.
      ); end if.
  ); end defun.
(princ)
.Net - F#
Код:
[Выделить все]
 #r "c:/program files/autocad 2010/acmgd.dll"
#r "c:/program files/autocad 2010/acdbmgd.dll"
open Autodesk.AutoCAD.ApplicationServices
open Autodesk.AutoCAD.DatabaseServices
open Autodesk.AutoCAD.Runtime
open Autodesk.AutoCAD.Geometry

let Rb=function
  |null->[]
  |(arg:ResultBuffer)->arg.AsArray()|>Array.toList
let (|AcEnt|AcUnknow|) (v:TypedValue)=
  enum<LispDataType>(v.TypeCode|>int)|>function
    |LispDataType.ObjectId->AcEnt(v.Value:?>ObjectId)
    |_->AcUnknow

[<LispFunction "GetGrips">]
let Test arg=
  arg|>Rb|>function
    |[AcEnt ent]->new ResultBuffer(let tr=Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction()
                                   let pd,ic=new Point3dCollection(),new IntegerCollection()
                                   (tr.GetObject(ent,OpenMode.ForRead):?>Entity).GetGripPoints(pd,ic,ic)
                                   tr.Commit()
                                   pd|>Seq.cast<Point3d>|>Seq.map (fun x->new TypedValue(LispDataType.Point3d|>int,x))|>Seq.toArray)
    |_->null
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 31
Размер:	34.7 Кб
ID:	85109  
Вложения
Тип файла: rar GetGrips - Acad 2010.rar (243.4 Кб, 29 просмотров)
Тип файла: rar кино.rar (478.3 Кб, 45 просмотров)
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 07.08.2012 в 16:53.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Преобразование объемных тел в стрежни



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение одинаковых тел и замена их на блоки Андрей Будзинский Программирование 2 26.10.2011 15:18
Нелинейный расчет в ПК Лира на разрушение фрагмента плиты из объемных элементов arturice Лира / Лира-САПР 13 10.01.2011 00:47
Как удобнее чертить в 3Д внутри пространственно расположенных тел, какие приемы у вас? BM60 AutoCAD 27 18.03.2010 08:47
Юмор 2009 DEM Разное 1736 01.01.2010 22:51
Отображение объемных тел в 3d игорёк AutoCAD 27 02.10.2007 16:02