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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Генерация 3DFace по точкам пересечения отрезков

Генерация 3DFace по точкам пересечения отрезков

Ответ
Поиск в этой теме
Непрочитано 02.07.2008, 20:02 #1
Генерация 3DFace по точкам пересечения отрезков
cyberkolbasa
 
дискретизатор континуума (бывший)
 
Уфа
Регистрация: 28.09.2005
Сообщений: 299

Приветствую коллеги.

Прошу помочь со следующей задачей:
1. Имеется набор отрезков образующих сетку с четырехугольными ячейками. Сетка лежит в одной плоскости.
2. Выделяем отрезки образующие сетку.
3. Генерируются четырехугольные 3DFace с углами совпадающими с узлами сетки.

Нужно для создания расчетных схем. В сочетании с лиспом BreakObjects получится мощная штука.
__________________
я еще не волшебник, я только учусь

Последний раз редактировалось cyberkolbasa, 03.07.2008 в 13:54. Причина: эээээ...
Просмотров: 3622
 
Непрочитано 04.07.2008, 18:10
#2
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Сложноватая программа получится, потому как без триангуляции здесь не обойтись. Да и к тому же нет гарантии, что исходная сетка, с точки зрения триангуляции, оптимальна - конечный результат может не совпасть с начальным.
Donhuan вне форума  
 
Автор темы   Непрочитано 04.07.2008, 19:01
#3
cyberkolbasa

дискретизатор континуума (бывший)
 
Регистрация: 28.09.2005
Уфа
Сообщений: 299


Не вижу ничего принципиально сложного (будет конечно пара моментов, которые заставят как следует "почесать репу"). Программа должна загнать в массив (ну или в случае лиспа в список) координаты точек пересечения/точек сопряжения выделенных линий. Затем в цикле прогнать команду 3dface по этим координатам. Все.

Сижу 2ой день "гоняю лисп". Вероятно к понедельнику и сам справлюсь с этой задачей. Однако от помощи окружающих, при наличии у них желания, по прежнему не отказываюсь.
__________________
я еще не волшебник, я только учусь
cyberkolbasa вне форума  
 
Непрочитано 04.07.2008, 20:27
#4
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


В случае если сеть типа "#" (то есть есть горизонтальный и вертикальный ряды линий и линии сплошные), то можно после вычисления точек пересечения просто закинуть их в комманду "3dmesh", а потом взорвать полученный объект - получишь отдельные 3DFace
Просто я исходил из более общих уловий, где ячейки могут быть произольной конфигурации.
Donhuan вне форума  
 
Автор темы   Непрочитано 04.07.2008, 21:00
#5
cyberkolbasa

дискретизатор континуума (бывший)
 
Регистрация: 28.09.2005
Уфа
Сообщений: 299


Не обязательно горизонтальные и вертикальные. Главное ячейки 4хугольные.

Более общие условия это хорошо. Но для начала в более простой постановке. А потом уже можно опции наращивать.
__________________
я еще не волшебник, я только учусь
cyberkolbasa вне форума  
 
Непрочитано 04.07.2008, 21:37
#6
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Выложите плиз пример файла с Вашей сетью, а то я Вас не понимаю, а Вы меня.
Donhuan вне форума  
 
Автор темы   Непрочитано 04.07.2008, 21:50
#7
cyberkolbasa

дискретизатор континуума (бывший)
 
Регистрация: 28.09.2005
Уфа
Сообщений: 299


Извольте.
Отключив слои "nastil*" получаем исходное состояние.
С включенными это то, что надо получить.
Вложения
Тип файла: dwg
DWG 2004
konv579_m.dwg (164.4 Кб, 568 просмотров)
__________________
я еще не волшебник, я только учусь
cyberkolbasa вне форума  
 
Непрочитано 07.07.2008, 20:34
#8
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Для этого случая подойдет вариант с "3dmesh", как я писал выше.
Donhuan вне форума  
 
Автор темы   Непрочитано 07.07.2008, 20:49
#9
cyberkolbasa

дискретизатор континуума (бывший)
 
Регистрация: 28.09.2005
Уфа
Сообщений: 299


Цитата:
Сообщение от Donhuan Посмотреть сообщение
Для этого случая подойдет вариант с "3dmesh", как я писал выше.
Да, пожалуй подойдет.
Спасибо.

Тогда алгоритм таков:
1. Разрываем LINE в местах пересечения лиспом BreakObjects
2. Выделяем требуемую область ("сеть" образованную лайнами)
3. Получаем координаты их start/end point (исключаем повторяющиеся координаты)
4. Строим 3DMESH по этим координатам
5. Взрываем 3DMESH
__________________
я еще не волшебник, я только учусь

Последний раз редактировалось cyberkolbasa, 07.07.2008 в 21:02.
cyberkolbasa вне форума  
 
Непрочитано 07.07.2008, 23:54
#10
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Я бы сделал так:
1. Находим все пересечения линий.
2. Тут есть один момент на который Вы не обратили внимания. Из полученного списка формируем матрицу для передачи в 3DMESH (см. Help, 3DMESH). Для работы с командой надо знать размерность матрицы, и к тому же если передать туда координаты скопом, то исходная сеть не получится.
3. Передаем матрицу в 3DMESH.
4. Взрываем 3DMESH.
Donhuan вне форума  
 
Непрочитано 08.07.2008, 23:12
#11
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Пробуй:
Код:
[Выделить все]
;;;Igor Kireev (Donhuan) 07.2008. Для dwg.ru.
;;;Программа отрисовки 3dMesh по точкам пересечений отрезков.
;;;Внимание! Перед использованием программы ознакомиться с описанием комманды AutoCad "3dMesh",
;;;для корретного создания сети отрезков (точки пересечений должны образовывать прямоугольную матрицу,
;;;все точи ряда должны попадать в заданный интервал по оординате y).
;;;Для задания интервала использовать глобальную переменную *fuzz* - параметр в единицах рисунка.

(setq *fuzz* 30); *fuzz* - ширина отбора точек в ряд по координате y.
;;;; list_point - исходный список '((x y z) (x y z) ...)
;;;; возвращает список '(((x y z) (x y z) ...) ((x y z) (x y z) ...) ... ), где ряды отсортированы по
;;;; возрастанию координаты y, столбцы - x.
(defun mesh_in:row_x_kolumn (list_point /)
  (cond
    ((null list_point) nil)
    (t ((lambda (x) (cons (car x) (mesh_in:row_x_kolumn (cadr x)))) (mesh_in:row_create list_point)))
  )
)
(defun mesh_in:row_create (list_point / row)
  (setq row (vl-sort
	      (vl-remove nil
	        (mapcar '(lambda (x)
			   (if (equal (cadar list_point) (cadr x) *fuzz*)
			     x
		           )
		         )
	        list_point)
	      )
            (function (lambda (e1 e2) (< (car e1) (car e2)))))
  )
  (list row (foreach x row (setq list_point (vl-remove x list_point))))
)


(vl-load-com)
(princ "\nПостроение 3dMesh по сети пересечений отрезков. Запуск программы: mesh_in\n")
(defun c:mesh_in (/ select mspace)
  (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          'mesh_in:main))
          (progn
            (mapcar '(lambda(x)(vla-Highlight x :vlax-false)) (mapcar 'vlax-ename->vla-object select))
            (print "Выполнение функции прервано.")
          )
  )
  (princ)
)

(defun mesh_in:main (/ matr old_CMDECHO)
  (princ "\nУкажите отрезки (примитивы Line):")
  (setq select (ssget '((0 . "LINE")))); выбор линий
  (setq select (vl-remove-if 'listp (mapcar (function cadr) (ssnamex select)))); извлечение из набора ename в список
  (mapcar '(lambda (x) (vla-Highlight x :vlax-true)) (mapcar 'vlax-ename->vla-object select)); подсветка списка
  (setq matr
    (vl-sort;формирование матрицы точек
      (mesh_in:row_x_kolumn
	(mesh_in:list_intersection
          (mapcar '(lambda (x) (list ((lambda (y) (list (car y) (cadr y))) (cdr (assoc 10 (entget x))))
	   			     ((lambda (y) (list (car y) (cadr y))) (cdr (assoc 11 (entget x)))))) select))
      )
    (function (lambda (e1 e2) (< (cadar e1) (cadar e2)))))
  )
  (setq old_CMDECHO (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (command "_.3dmesh" (length matr) (length (car matr)))
  (mapcar '(lambda (x)
	     (mapcar '(lambda (y) (command y)) x)) matr)
  (command "_.explode" (entlast))
  (mapcar '(lambda(x)(vla-Highlight x :vlax-false)) (mapcar 'vlax-ename->vla-object select))
  (setvar "CMDECHO" old_CMDECHO)
  (princ "\n")
)


(defun mesh_in:list_intersection (list_line)
; list_line - список отрезков в виде '(((point 1) (point2)) ((point1) (point2)) ... ())
; на выходе список пересечений отрезков '((x y z) (x y z) ...)
  (if (cdr list_line) 
      (append
	((lambda (a b)
	    (vl-remove nil
	      (mapcar '(lambda (x)
			 ((lambda (y)
			    (if y
			      y
			      nil
			    )) (inters a b (car x) (cadr x) t))) (cdr list_line))
	    )
	  ) (caar list_line) (cadar list_line))
	 (mesh_in:list_intersection (cdr list_line))
      )
      nil
  )
)
Donhuan вне форума  
 
Автор темы   Непрочитано 09.07.2008, 14:26
#12
cyberkolbasa

дискретизатор континуума (бывший)
 
Регистрация: 28.09.2005
Уфа
Сообщений: 299


Donhuan, спасибо. В рамках того, что мне было нужно, отлично работает.
__________________
я еще не волшебник, я только учусь
cyberkolbasa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Генерация 3DFace по точкам пересечения отрезков



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обрезка полилинии или отрезков в местах пересечения блоков Джек Программирование 7 17.09.2006 22:11