Связь между объектами чертежа. Есть ли какие-нибудь инструменты?

Автор Тема: Связь между объектами чертежа. Есть ли какие-нибудь инструменты?  (Прочитано 65432 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Спасибо! Сейчас, с новыми силами и вооружившись вашими советами, попробую одолеть эту задачу :)

Александр Наумович, низкий Вам поклон! Запустил утилиту регистрации событий, получил такой листинг:
[Doc Event] : Command will Start        : COPYBASE
Базовая точка:
[Editor Event] : Prompting For Point
[Editor Event] : Point Filter
[Editor Event] : Point Monitor
[Editor Event] : Prompting For Selection
[Editor Event] : Selection Added
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Editor Event] : Point Filter
[Editor Event] : Point Monitor
[Editor Event] : Point Filter
[Editor Event] : Point Monitor
[Editor Event] : Point Filter
[Editor Event] : Point Monitor
[Editor Event] : Prompted For Point
[Editor Event] : Prompting For Selection
[Editor Event] : Selection Added      найдено: 5

[Editor Event] : Prompting For Selection
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Editor Event] : Prompting For Selection
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Editor Event] : Prompting For Selection
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Editor Event] : Prompting For Selection
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Doc Event] : Implied Selection Changed
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[DB Event : 749142272] : Object Modified           : <DrawOrderTable, 27F0>
[DB Event : 749142272] : Object Modified           : <DrawOrderTable, 27F0>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 1F>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 5D>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 1F>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 119C>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 11A4>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 9B16>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 9B3B>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 9B60>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 9B86>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 9BAC>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 9BD3>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, AF81>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 11759>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 11778>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 117AF>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 11B71>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13A73>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13A8C>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13ABC>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13AD9>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13B08>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13B50>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13B6B>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13B92>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13BAD>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13BC8>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13BE2>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13BF8>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13C11>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13C62>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 13C7E>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 14584>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 146A7>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 146AC>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 146B1>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 146B7>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 148AC>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 155AD>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 15E59>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 17792>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 1F05A>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 1F085>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 1F4B7>
[DB Event : 749142272] : Object Modified           : <BlockTableRecord, 1F8E2>
[DB Event : 749142272] : Wblock Notice             : To = C:\Users\Zagorulkin_DY\appdata\local\autodesk\c3d 2014\rus\template\_autocad civil 3d (metric)_rus.dwt
[DB Event : 55343840] : Database Constructed
[Editor Event] : Selection Added
[Editor Event] : Prompting For Selection
[Editor Event] : Selection Added
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Editor Event] : Prompting For Selection
[Editor Event] : Selection Added
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Editor Event] : Prompting For Selection
[Editor Event] : Selection Added
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Editor Event] : Prompting For Selection
[Editor Event] : Selection Added
[Editor Event] : Prompt For Selection Ending
[Editor Event] : Prompted For Selection
[Doc Event] : Implied Selection Changed
[Doc Event] : Command Ended             : COPYBASE
Ключевой для меня момент - [DB Event : 55343840] : Database Constructed, т.е., создание базы данных отловить можно! Просто для этого нужно использовать события не отдельного объекта Database, а класса Database!
Дальше, думаю, проблем быть не должно.
В общем, копирование объектов между чертежами выполняется примерно по такому сценарию (может кому пригодится):
- при Ctrl+C создается новая база данных чертежа, в нее помещаются выбранные объекты
- далее, эта база данных сохраняется в чертеж в папке Temp с именем типа "A$C70F66046.DWG", на каждое копирование создается новый чертеж
- каким-то образом приложение отслеживает связь между чертежом, из которого копировали и этими временными файлами, т.к. после закрытия чертежа все относящиеся к нему временные файлы удаляются из Temp
- в буфере обмена также есть копия этого чертежа, потому что даже после закрытия файла-источника (соответственно, уничтожения всех его временных файлов), можно выполнить вставку ранее скопированных объектов в другой чертеж (если мне память не изменяет)
- соответственно, при вставке этот временный файл вставляется как блок в чертеж и в зависимости от команды вставки расчленяется или нет. Если нет (pasteblock) - то получается блок с именем, которое было у файла.

Кстати, по поводу события WblockNotice вопрос остается открытым :)
« Последнее редактирование: 11-07-2014, 11:13:56 от Загорулькин Дмитрий »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я вижу, что ты воспользовался не ARXDBG, а MGDDBG. И похоже я прав, что далеко не все реакторы ObjectARX имеют эквиваленты в AutoCAD .NET API, а некоторые еще и неправильно работают. В частности WblockNotice. В ObjectARX в такой же ситуации:
[EVENT REACTOR] : [Wblock Notice]   (Db = 000000002A4443E0  "C:\Temp\Drawing1_1_1_1438.sv$")
[EVENT REACTOR] : [Begin Deep Clone: context = Wblock]   (Db = 0000000030E60EF0  "")
Соотвественно текущая база и та, в которую выполняется Wblock - разные.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
а некоторые еще и неправильно работают.
Autodesk не даёт расслабляться...

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я вижу, что ты воспользовался не ARXDBG, а MGDDBG. И похоже я прав, что далеко не все реакторы ObjectARX имеют эквиваленты в AutoCAD .NET API, а некоторые еще и неправильно работают. В частности WblockNotice. В ObjectARX в такой же ситуации:
[EVENT REACTOR] : [Wblock Notice]   (Db = 000000002A4443E0  "C:\Temp\Drawing1_1_1_1438.sv$")
[EVENT REACTOR] : [Begin Deep Clone: context = Wblock]   (Db = 0000000030E60EF0  "")
Соотвественно текущая база и так, в которую выполняется Wblock - разные.
Да, у меня MGDDBG уже была на компьютере, решил ей воспользоваться. Думал, что большой разницы между ними нет...
Вот такое поведение, как в ObjectARX я от этого реактора и ожидал...
А что это за идентификатор базы? Db = 0000000030E60EF0

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
а некоторые еще и неправильно работают...
Соотвественно текущая база и так, в которую выполняется Wblock - разные.
А почему это ошибка (я просто спрашиваю, а не говорю что все правильно), или если так правильней в чем именно ошибка - копипаста-то работает (а как им там внутри это реализовывать это ихмо их дело).

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Попробую объяснить.
Есть база чертежа (База1). Отслеживаем у нее событие WblockNotice (из мурзилки: Wraps AcRxEventReactor::wblockNotice. The event indicates that a wblock operation is about to start.) - это предупреждение о том, что вот-вот начнется копирование объектов в другую базу (База2).
У делегата этого события есть два аргумента, первый - object sender. В нашем случае - это База1, она сообщает о событии.
Второй аргумент - WblockNoticeEventArgs e. У него только одно отличие от системного EventArgs - свойство "To". переводим на русский язык - это предлог "В". Логично предположить, что это какая-то характеристика объекта, в который будет производиться копия. Смотрим мурзилку: Gets the database being written to.
По идее, получается, что в sender должна быть База1, в e.To - База2.
По факту, при выполнении кода, я обнаружил, что в sender и в e.To - одна и та же база данных - База1.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Все - да, то что свойство TO  показывет свою-же, а не "целевую" базу это явно косяк, просто я из объяснения Александра, не понял, что речь идет о разнице между arx/net...
я подумал, что то что базы разные и есть ошибка - и удивился почему...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А что это за идентификатор базы?
Я посмотрел в коде ARXDBG - это просто адрес в памяти, где расположен это объект.
А почему это ошибка (я просто спрашиваю, а не говорю что все правильно), или если так правильней в чем именно ошибка - копипаста-то работает (а как им там внутри это реализовывать это ихмо их дело).
Дима. В ObjectARX есть два реактора:
AcRxEventReactor::wblockNotice и AcEditorReactor::wblockNotice и в документации сказано, что для первого реактора эта база в которую будут копироваться объекты в результате Wblock, а для второго реактора - база откуда они будут копироваться. По факту (судя по моему протоколу ARXDBG) это одна и таже новая временная база:
[EVENT REACTOR] : [Wblock Notice]   (Db = 000000002A4443E0  "C:\Temp\Drawing1_1_1_1438.sv$")
[ED REACTOR]    : [Wblock Notice]   (Db = 000000002A4443E0  "C:\Temp\Drawing1_1_1_1438.sv$")
Database.WblockNotice должно быть "оберткой" для AcRxEventReactor::wblockNotice (исходя тоже из документации) и соотвественно должна возвращать базу в которую будет выполняться Wblone. Но похоже это не так.


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Да спасибо - я уже разобрался (не так понял, что Вы имеете в виду под ошибкой).

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я посмотрел в коде ARXDBG - это просто адрес в памяти, где расположен это объект.
Эх, жаль. Я думал, что это какой-то уникальный идентификатор базы данных. Пока я такого не смог найти. Может быть, Вы подскажете? :)
Но похоже это не так.
Можете сами проверить. Возможно и АДН это интересно будет :)
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Runtime;
  10.  
  11. namespace WblockNoticeTest
  12. {
  13.     public class CmdClass
  14.     {
  15.         Document adoc = Application.DocumentManager.MdiActiveDocument;
  16.         Database db = Application.DocumentManager.MdiActiveDocument.Database;
  17.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  18.  
  19.         [CommandMethod("WblockNoticeTest")]
  20.         public void AddEventHandler()
  21.         {
  22.             db.WblockNotice += new WblockNoticeEventHandler(db_WblockNotice);
  23.             ed.WriteMessage("\nSelect objects and run command COPYCLIP or COBYBASE");
  24.         }
  25.  
  26.         void db_WblockNotice(object sender, WblockNoticeEventArgs e)
  27.         {
  28.             Database sendDb = sender as Database, toDb = e.To;
  29.             Application.ShowAlertDialog(sendDb.Equals(toDb) ? "Databases are equivalent!" : "Databases differ!");
  30.         }
  31.     }
  32. }

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я посмотрел в коде ARXDBG - это просто адрес в памяти, где расположен это объект.
Эх, жаль. Я думал, что это какой-то уникальный идентификатор базы данных.
Ну, с некоторыми ограничениями, это в общем-то так.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А из NET к нему можно добраться?

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
К адресу или объекту?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Ок, задам вопрос по-другому :)
У меня в одной переменной сохранена одна БД, в другой - другая. По какому свойству я могу определить, что они разные? Не применяя метода Equal.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
По какому свойству я могу определить, что они разные?
Оххх... По поводу сравнения объектов это тема реально на целую книгу. Что есть "одинаковые БД", equal как-раз таки и проверяет ссылаются ли объекты на один и тот-же физический адрес (то есть, что это одно и то-же). А вот если дважды открыть один и тот-же файл можно-ли это рассматривать как "одиноковые" БД - вопрос не однозначен (по крайней мере время открытия будет разным, handle внутренних объектов то-же и пр.), то есть надо определиться, что все-таки важно в сравнении - быть может, например, достаточно будет сверить свойства Filename...