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

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

VBA: как связать между собой блоки

Ответ
Поиск в этой теме
Непрочитано 25.02.2014, 13:12 #1
VBA: как связать между собой блоки
Фирст
 
Регистрация: 25.02.2014
Сообщений: 9

Имеется дерево из блоков с атрибутами (по аналогии с каталогами на диске).
Требуется копировать/вставлять отдельные ветки (выбранные части веток) так, чтобы они сохраняли внутренние связи между собой.

Предполагаю, в каждом блоке должна быть ссылка на предыдущий блок уровня -1, ссылка на соседний блок этого же уровня и следующий блок уровня +1. (Ссылка по номеру блока в соответствующем атрибуте)

При вставке создать в памяти таблицу старых ссылок из набора вставленных блоков (как? перехватить Ctrl-V ? создать свою команду вставки?)
Дать новые номера блокам с занесением в таблицу, а затем по таблице пересчитать ссылки в атрибутах (это понятно).

Может есть способ проще?
И как сделать чтобы ObjectID не менялся с каждым открытием файла?
Просмотров: 4388
 
Непрочитано 25.02.2014, 13:24
#2
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Фирст Посмотреть сообщение
Может есть способ проще?
Непонятно для чего это всё и следовательно непонятна методика.
maratovich вне форума  
 
Автор темы   Непрочитано 25.02.2014, 13:34
#3
Фирст


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


Нужно редактировать это дерево и забивать в атрибуты требуемые текстовые данные.
Блоки содержат графические обозначения и вместе с текстом и связями составляют итоговый документ.
Линии связей должны рисоваться автоматически - это я представляю как.
Фирст вне форума  
 
Непрочитано 25.02.2014, 13:42
#4
Кулик Алексей aka kpblc
Moderator

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


Фирст, вложенные блоки - это вложенные блоки. Копируй "родителя" и все вложенные блоки автоматом перекопируются.
Или ты говоришь не про AutoCAD.
Цитата:
Сообщение от Фирст Посмотреть сообщение
И как сделать чтобы ObjectID не менялся с каждым открытием файла?
Никак. Используй Handle - они по крайней мере внутри одного файла уникальны и неизменны.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2014, 13:57
#5
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


на сколько я понял, блоки совсем не вложенные друг в друга, и человек пытается реализовать свою собственную структуру данных.
тоже давно интересует данная тема и если не секрет, то
Цитата:
Имеется дерево из блоков с атрибутами
- в каком виде?
и любопытно посмотреть на уже созданные блоки, да и вообще - модель
если я правильно понял задумку, то атрибутов на уровень "+1" нужно создавать неопределенное количество, т.к. полагаю дочерних объектов может быть "не один"
и тут же непонятно зачем может пригодиться ссылка на "соседний" блок того же уровня
kakt00z вне форума  
 
Автор темы   Непрочитано 25.02.2014, 14:04
#6
Фирст


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Фирст, вложенные блоки - это вложенные блоки.
Блоки не вложенные, связи вручную рисует разработчик. При изменении дерева все линии корректируются.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Используй Handle - они по крайней мере внутри одного файла уникальны и неизменны.
Спасибо! Проверил, они и в копии файла не меняются.
Фирст вне форума  
 
Непрочитано 25.02.2014, 14:28
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от kakt00z Посмотреть сообщение
если я правильно понял задумку, то атрибутов на уровень "+1" нужно создавать неопределенное количество, т.к. полагаю дочерних объектов может быть "не один"
Очень здравая мысль.
Вот как в БД реализуются древовидные структуры: http://www.ibase.ru/devinfo/treedb.htm, тут можно по аналогии делать. Принцип прост - у каждого элемента есть запись о том, кто его владелец. А с помощью программного кода можно выстроить всю иерархию.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 25.02.2014, 14:51
#8
Фирст


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


Схематично, структура дерева как на рис. А
Но программно это неудобно, поскольку у каждого "родителя" может быть разное число "потомков".
Поэтому структура дерева как на рис. Б, но у каждого "потомка" есть ссылка на "родителя" чтобы чертить линии как на рис А.
Изображения
Тип файла: jpg model.JPG (26.3 Кб, 275 просмотров)
Фирст вне форума  
 
Непрочитано 25.02.2014, 15:14
#9
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


у меня одного мозг взорвался? )))
... по теме - думаю - что проще/удобнее реализовать структуру - средствами словарей и XRecord/XRecordData в своём созданном словаре, а уже блокам прикручивать (можно и в виде атрибутов) handl'ы этих словарей/записей
аналогия
папка = словарь
файл = запись

PS Do$, сенк за линку

Последний раз редактировалось kakt00z, 25.02.2014 в 15:21.
kakt00z вне форума  
 
Автор темы   Непрочитано 25.02.2014, 15:54
#10
Фирст


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


Цитата:
Сообщение от kakt00z Посмотреть сообщение
средствами словарей и XRecord/XRecordData
Не совсем понимаю, как это можно использовать (можно пример?). Я записывал расширенные данные в объект, но смог только добавлять. Отредактировать или удалять не смог (можно пример?). Доступ к данным только перебором, при этом неизвестно какие новее (возможно те, что идут первыми).
И при копировании объекта вся эта инфа копируется в новый.

Последний раз редактировалось Фирст, 25.02.2014 в 16:04.
Фирст вне форума  
 
Непрочитано 25.02.2014, 16:07
#11
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


расширенные данные это немного не то, что я имел ввиду (хотя их тоже можно использовать для привязки блокам handl'ов X-записей), и уверен они, если не редактируются, то удаляются
на VBA примеров не покажу, вот наброски мыслей в лиспе, думаю что-то понятно будет
Код:
[Выделить все]
 
(setq dicts (vla-get-Dictionaries #actdoc))

(setq dbdictname "kd_testdict")
(setq #dbdict (vla-add dicts dbdictname))
(do #dbdict) ; do = vlax-dump-object

(setq dbdictnamechild "kd_testdictchild")
(setq #dbdictchild (vla-addobject #dbdict dbdictnamechild "acdbDictionary"))

;    в принципе, не нужно хранить переменные с названем словарей, до них можно добраться из самих словарей
;(vla-GetObject #dbdict dbdictnamechild)
;(vla-item #dbdict dbdictnamechild)
;(vla-GetName #dbdict #dbdictchild)

(setq tdn "kd_testdictchild1")	; test dict name
(setq testdct (vla-addobject #dbdict tdn "acdbdictionary"))
(vla-item #dbdict tdn)
(do testdct)

;;; получилась структура

;;;  kd_testdict :                        
;;;	        [                         
;;;              kd_testdictchild         
;;;              kd_testdictchild1
;;;                ]                      

;; предполагаемые функции

xdb:addDictionary
добавить словарь [создать папку в папке], если такового не существует [если сущ.-то варианты синхронизации внутренних данных]
xdb:addXrecord
добавить запись [создать файл в папке], если такового не существует [если есть-то варианты изменить/нет/дополнить(синхронизировать)]
	подфункции
	kd:setxrecdata
	kd:getxrecdata

;(setq xr (vla-addxrecord testdct "head"))
;(kd:setxrecdata (vla-item testdct "head") '("KKS" "func" "description" "type"))
;(kd:getxrecdata (vla-item testdct "head"))
;(vla-delete (vla-item testdct "head"))
(setq $xrec (vla-addxrecord testdct "head")))
(kd:setxrecdata
  $xrec
  '("KKS" "func" "description" "type" "blockHandle")
  )
; пример (очень отдаленный) синхронизации блока и его x-записи
(vla-put-textstring
  (getblockattribute "syncHandle")
  (vla-get-Handle $xrec)
  )
kakt00z вне форума  
 
Непрочитано 28.02.2014, 15:29
#12
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


Кстати, вопрос:
Цитата:
Сообщение от Фирст Посмотреть сообщение
Линии связей должны рисоваться автоматически - это я представляю как.
каким образом вы храните координаты точки блока для "стыковки" графической линии связи с ним?
kakt00z вне форума  
 
Автор темы   Непрочитано 03.03.2014, 12:21
#13
Фирст


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


Блоки собраны так, что базовая точка блока (InsetionPoint) определяет левый верхний угол, а InsetionPoint одного из скрытых атрибутов правый нижний угол. Это не обязательно реальные границы блока. Точку привязки я вычисляю как середина нужной стороны получившегося прямоугольника (на рис. два прямоугольника половинного размера).
Изображения
Тип файла: jpg Priv.JPG (28.8 Кб, 214 просмотров)
Фирст вне форума  
 
Непрочитано 18.04.2014, 01:39
#14
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


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

Последний раз редактировалось kakt00z, 03.01.2015 в 12:53.
kakt00z вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA: как связать между собой блоки



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
минимальное расстояние между лестничными маршами Laki Конструкции зданий и сооружений 11 23.08.2013 11:52
ЛИСП слои цвета преобразование Gotch LISP 97 08.11.2011 10:22
Как связать размеры деталей в сборке ? Grafandin Другие CAD системы 3 20.02.2008 08:29
Перегородка: кирпич или гипсолитовые блоки? Pilot Прочее. Архитектура и строительство 8 08.06.2007 09:58
"сложный узел": соединение 41кэ между собой. Евгений 88 Прочее. Программное обеспечение 8 04.03.2007 13:06