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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как в получить дополнительное описание геометрии "новой" сети в A2010

Как в получить дополнительное описание геометрии "новой" сети в A2010

Ответ
Поиск в этой теме
Непрочитано 09.04.2010, 21:23 #1
Как в получить дополнительное описание геометрии "новой" сети в A2010
atollon
 
Регистрация: 26.03.2010
Сообщений: 240

Используя LISP
В списке новой сети (0. "MESH") -AutoCAD 2010, сразу видны-доступны все вершины (10 x y z), однако нет старых полей, как в (0 . "POLYLINE")-AutoCAD2006, по которым можно было узнать кол-во рядов-столбцов(N-M) (surftab1-2 - ключи 71-72), вариант замкнутости есть-нет и в том и/или ином направлении, сеть это или полилиния (ключ 70). Как не менял размерность сети перед созданием командой _edgesurf переменными surftab1-2 - поля (71 . 2)(72 . 0) не меняются, известно только ко-во вершин (92. nn)

Получается:
Либо работать в старом Автокаде - не подходит

Либо как то получать командами построения сетей (п-край,сдвиг,вращения,соединения) не новую, а старую сеть, с доступными узелками вершин (пока строится только командой 3dсеть - но не писать же для нее дублирующие команды по созданию сетевых объектов, с описанием координат всех вершин), или преобразовать новую сеть в старую (при сохранении чертежа в старом формате - DWG/DXF 2006 - в том Автокаде они отображаются как ObjectDBX, в 2010 остаются тойже сетью - т.е. не преобразуются).

Либо переписывать программы для работ с вершинами новых сетей, а тут как раз и неясно, как определять, какие вершины на каком крае (раньше можно было вычислить по N-M), какие внутренние, в каком направлении замкнута, т.е. какие ряды-столбцы "зациклены". Если в старой сети можно(нужно) было пойти по именам списков внутрених узлов сети, то здесь ткнулся на 2 уровня вниз (1-ый (330 . <>) дает список еще на 4 имени - (360.<>)(330.<>)(360.<>)(340.<>)) - все не то.
__________________
Толстов Евгений
Просмотров: 3963
 
Непрочитано 10.04.2010, 22:48
#2
Кулик Алексей aka kpblc
Moderator

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


Попробуй приложить файл со "старой" и с "новой" сетями. Для гарантии сделай обе по крайней мере похожими. И подробнее расскажи, что тебе надо в результате получить.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.04.2010, 01:37
#3
atollon


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


Выкладываю пример файла с 2-мя сетями, построенными по контуру (4 3М отрезка) командой П-Кромка, Surftab1=3 Surftab2=6 и П-Вращения, Surftab1=6 Surftab2=3 в 2006 и 2010 Автокаде. Команда "одна и та-же", тип объекта - разный.
В свойствах сеть 2006 - Полигональная сеть. При выборе обекта - все вершины выделяются. Средствами Лиспа (SSGET и пр) при просмотре списка - имеет поля с ключами, определяющими варианты замкнутости (70 . ...) и кол-во рядов-столбцов (71 . ...)(72 . ...). Если просматривать последующие списки для (0 . "VERTEX") до (0 . "SEQEND") - можно получить (сделать) список с координатами узлов. Зная кол-во рядов-столбцов я всегда могу взять любой узел в списке и вычислить, в каком ряду-столбце он находится N(i,j), а также номер в общем списке координат узлов для соседних, связанных с этим узлов (i-1,j) (i+1,j)(i,j-1)(i-1,j+1) - рядом выше-ниже, в столбце правее-левее.

В сети, выполненной той же командой в 2010 автокаде другой формат данных. Все координаты (10 x y z) сразу видны при вызове списка объекта. Плюс никак не связанное с кол-вом вершин-ячеек, размерностью сети (неразобрался) значения и поля (90 ...)(91 ...) (93 ...) (94 ...) (95 ...) (140 ...). Поля (71 . ...) и (72 . ...) - более не отображают кол-во рядов-столбцов сетки - значения не меняются. Нет поля и для определения замкнута или нет сеть (70 ...). Т.е. в этом списке проще получить координаты вершин, но выполнять потом расчеты по нему нельзя, т.к. требуется, чтобы программа после выбора любой сети могла не просто составить список вершин, а и определить, к каким рядам-столбцам они принадлежат, с какими вершинами связаны, а для этого непонятно, откуда ей взять исходные данные. Сетки могут быть достаточно мелкие, так что на глазок - не просчитаешь, вручную не добавишь как расширенные данные, разве что программно, еще на этапе создания сетки совместить стандартную команду со своим лиспом.
Прилагаю Lisp для просмотра списка атрибутов выбранных объектов.
Вложения
Тип файла: lsp TOL-ATR.LSP (1.7 Кб, 55 просмотров)
Тип файла: dwg
DWG 2010
Сеть 2006-2010.dwg (249.2 Кб, 473 просмотров)
__________________
Толстов Евгений

Последний раз редактировалось atollon, 11.04.2010 в 12:05.
atollon вне форума  
 
Непрочитано 11.04.2010, 12:19
#4
Кулик Алексей aka kpblc
Moderator

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


У меня нет русского AutoCAD Посему вопрос: объекты в 2010 создавались командой _3dmesh или _pface? Мне просто даже справку не посмотреть по командам... И ситуацию не промоделировать.
А так да, объекты разные: в 2006 создавалась AcDbPolygonMesh, в 2010 - AcDbSubDMesh. У второго объекта в дампе вообще нет свойств mclose или nclose. Так что наверняка проблема именно в неполной или неверной локализации, я думаю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.04.2010, 16:14
#5
atollon


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


В файле примере использовал:
_edgesurf (П-Кромка - в 2010 и в 2006)
_revsurf (П-ВРАЩ)
Вначале сделал сети в 2006, потом открыл файл в 2010 и повторил команды.

_3dmesh и в 2006 и в 2010 создает одинаковый формат сети, но требует программного задания вершин (+ стандартные формы куб, клин,...), не использует объекты контуров, образующих и тп, как в командах _revsurf,_tabsurf,_rulesurf,_edgesurf

Команды редактирования "новой" сети (из текстового меню Редактировать и из контекстного меню) не позволяют преобразовать ее в полигональную сеть 2006 образца или как от _3dmesh. Расчленить тоже не "помогает". Нужен или стандартный Автокадовский инструмент преобразования сети в полигональную или способ вычислять стуктуру сетки (взаимосвязей узлов - с какими соседними связь) средствами Лиспа из данных списка.
Данные сети нужны для моделирования в Автокаде Тентовых оболочек, для сглаживания, моделирования минимальной формы, или различных вариантов преднапряжения (разных пропорций отр.гауссовой кривизны), гибкого контура, внешних-внутренних узлов контура, внутренних вант преднапряжения, отверстий... Естественно, тут важно знать, с какими узлами связан каждый узел сети.
Команды П-Кромка и П-Вращ использовались для быстрой привязке сетки к некоторым контурам с последующим редактированием положения отдельных узлов (внутренних и по контуру). Дополнительная информация моделирования различных условий для расчета координат узлов сети дописывалась к данным сети, тем самым сохраняясь и восстанавливаясь при следующих сеансах моделирования форм.

Программка для старой структуры данных сети разрабатывалась, и то, в какойто версии в Автокаде та уже менялась - ранее все координаты тоже были в основном списке, а не разбросаны по подспискам вершин, и вот с новой версией Автокада опять проблема, надо обеспечить совместимость, а как...
Миниатюры
Нажмите на изображение для увеличения
Название: Проект-009-ЧБ.jpg
Просмотров: 62
Размер:	23.3 Кб
ID:	37137  Нажмите на изображение для увеличения
Название: Проект-012-ЧБ.jpg
Просмотров: 60
Размер:	35.6 Кб
ID:	37138  Нажмите на изображение для увеличения
Название: Проект-007а-ЧБ.jpg
Просмотров: 65
Размер:	79.3 Кб
ID:	37139  
__________________
Толстов Евгений

Последний раз редактировалось atollon, 11.04.2010 в 17:23.
atollon вне форума  
 
Автор темы   Непрочитано 16.04.2010, 01:40
#6
atollon


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


Таки нашел - в HELP'е AutoCAD'a 2010 - частичное решения моей проблемы - переменная MESHTYPE=0 при создании сети командами П-ВРАЩ, П-СДВИГ, П-СОЕД или П-КРОМКА (или как выдает в ком.строке: _revsurf, _tabsurf, _rulesurf, _edgesurf ).
По Умолчанию MESHTYPE=1 - новая разновидность сети и формат ее данных.
При MESHTYPE=0 - старый, полигональный вид сети - доступны узлы для "ручного" редактирования координат узлов сети, и данные для Лиспа по кол-ву рядов-столбцов и варианту замкнутости.

Однако все еще хотелось бы получить информацию, которая помогла бы учитывать в Лиспе взаимосвязь вершин и для новых, сглаживаемых сетей 2010 - ведь несут же какуюто информацию поля (90 ...)(91 ...) (93 ...) (94 ...) (95 ...) (140 ...)...
__________________
Толстов Евгений

Последний раз редактировалось atollon, 16.04.2010 в 01:55.
atollon вне форума  
 
Непрочитано 16.04.2010, 02:47
#7
Кулик Алексей aka kpblc
Moderator

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


Ну, если надо только получить координаты, то можно сделать и так:
Код:
[Выделить все]
(defun _dwgru-get-vertexcoord-in-mesh (ent / _kpblc-conv-list-to-3dpoints)
                                      ;|
*    Получение списка координат сети.
*    Параметры вызова:
	ent		указатель на сеть. ename или vla. nil -> выход
*    Возвращает список координат 3D-точек
* !! Для немировой системы координат не проверялось !!
|;
  (defun _kpblc-conv-list-to-3dpoints (lst / res)
                                      ;|
*    Функция конвертации списка чисел в список 3-мерных точек.
*    Параметры вызова:
*	lst	список чисел
*    Примеры вызова:
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5 6)) ;-> ((1 2 3) (4 5 6))
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5))   ;-> ((1 2 3) (4 5 0.))
|;
    (cond
      ((not lst)
       nil
       )
      (t
       (setq res (cons (list (car lst)
                             (if (cadr lst)
                               (cadr lst)
                               0.
                               ) ;_ end of if
                             (if (caddr lst)
                               (caddr lst)
                               0.
                               ) ;_ end of if
                             ) ;_ end of list
                       (_kpblc-conv-list-to-3dpoints (cdddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    res
    ) ;_ end of defun

  (cond
    ((= (type ent) 'ename)
     (_dwgru-get-vertexcoord-in-mesh (vlax-ename->vla-object ent))
     )
    ((and (= (type ent) 'vla-object)
          (wcmatch (strcase (vla-get-objectname ent)) "*MESH")
          ) ;_ end of and
     (if (/= (type (setq res (vl-catch-all-apply
                               (function
                                 (lambda ()
                                   (_kpblc-conv-list-to-3dpoints
                                     (vlax-safearray->list (vlax-variant-value (vla-get-coordinates ent)))
                                     ) ;_ end of _kpblc-conv-list-to-3dpoints
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ) ;_ end of vl-catch-all-apply
                         ) ;_ end of setq
                   ) ;_ end of type
             'list
             ) ;_ end of /=
       (setq res nil)
       ) ;_ end of if
     )
    ) ;_ end of cond
  res
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.04.2010, 12:52
#8
atollon


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


Что то как то сложно и непонятно, да и полуфабрикат
А достать координаты из списков по ключу (10 x y z) - не проблема
В старой, полигональной сети (0 . "POLYLINE") - по одной они спрятаны в последующих (ENTNEXT ...) списках (0 . "VERTEX") до (0 . "SEQEND")
В новой (0. "MESH") они уже идут подрят (10 ...)(10 ...)... Срезать список до первого ключа (MEMBER (ASSOC 10 ...)...), реверс, и опять срезать, реверс - вот и готов список координат, ну а вырезать ключ 10 (CDR ...) - тоже несложно

Нужен не список, а информация о связях узлов. Рассматриваемая сетка регулярная, ячейки четырехугольные, в старой есть кол-рядов-столбцов. Взяв из списка координат любой номер вершины можно ВЫЧИСЛИТЬ номер соседней вершины в том же ряду-столбце выше-ниже, правее-левее. А вот как это сделать со списком вершин из новой сети? Есть ли какие нибудь данные, по которым можно былобы получить, что например в сетке 3х4 (что как раз и неизвестно - в новой сети только кол-во узлов) узел №6 связан с узлами 5, 7, 2, 10, а узел 5 (на контуре) - только с 6, 1, 9, или, если замкнута, то 8, 6, 1, 9?
Миниатюры
Нажмите на изображение для увеличения
Название: номера узлов сетки.jpg
Просмотров: 41
Размер:	26.9 Кб
ID:	37524  
__________________
Толстов Евгений

Последний раз редактировалось atollon, 16.04.2010 в 13:35.
atollon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как в получить дополнительное описание геометрии "новой" сети в A2010

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Как получить таблицу свойств объектов такую же как в OrCad passat AutoCAD 1 08.12.2004 01:12