Я не увидел вопроса. И причем здесь иерархия?случайно нажал, до того как полностью сформулировать
чего-то я уже ничего не понимаю...Ты хоть один готовый пример посмотрел? У тебя не код, а бред сивой кобылы.
listOfBlocks.Add(entity); // а здесь мне говорят нет: нельзя entity привести к BlockreferenceТы должен сам привести к BlockReference. BlockReference всегда автоматом приводится к Entity, т.к. BlockReference наследник Entity. А вот обратное преобразование автоматически не происходит, т.к. Entity далеко не всегда BlockReference. Например, может быть Polyline.
1. Ты присвоил значение document, editor, database? Нет. Почему?
для сокращения using и прочие не принципиальные, в данном вопросе, места буду сокращать
2. Ты воспользовался editor.SelectImplied() для получения набора предварительного выбора. Замечательно. А зачем ты его сразу чистишь?здесь не в этом дело, опять же для простоты!
Цитата: Luca от 13-11-2019, 13:25:17Больше так не делай. Сюда выкладывай нормальный код, а не какие-то куски.
для сокращения using и прочие не принципиальные, в данном вопросе, места буду сокращать
Цитата: Александр Ривилис от 13-11-2019, 13:46:11Бред. Какая простота? Ты его полностью очистил, т.е. у тебя набор стал пустым (ни одного примитива в нём нет). Что дальше ты будешь обрабатывать?
2. Ты воспользовался editor.SelectImplied() для получения набора предварительного выбора. Замечательно. А зачем ты его сразу чистишь?
здесь не в этом дело, опять же для простоты!
сбрасываю для того, чтобы ничего лишнего не попало в предварительный выбор.
(BlockReference)entity?Да. Или (entity as BlockReference)
где все эти зависимости посмотреть можно?В составе ObjectARX SDK есть classmap\classmap.dwg - в нём иерархия классов.
Ну и тут кратко и немного упрощенно: https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-7E64FDE7-C818-4566-ADF8-C40D50D91E32это слишком упрощенно )
В составе ObjectARX SDK есть classmap\classmap.dwg - в нём иерархия классов.это уже "ближе к телу", "как говорил Мопасан". надо будет повнимательнее посмотреть.
а как блоки различать, тк они разные?По имени (Name).
Чем дальше, тем больше я понимаю что ты не внимательно читаешь то, что я тебе пишу. Я писал, что открытые в транзакции объекты, не доступны после завершения транзакции.вопрос не в чтении, а в понимании написанного. а где за границами операторных скобок {} пытаюсь обратиться к объекту, который открыл?
В AutoCAD не используют Console.WriteLine и Console.ReadLine. Для этой цели используют Editor.WriteMessage и Editor.GetStringкак использовать едитор, если я его ещё не получил или не смог получить
Строки 35 - 38 выкинуть.те сбрасывать не нужно? а вдруг уже что-то выделенное есть и попадет то, что не должно попасть? или оно само сброситься?
а где за границами операторных скобок {} пытаюсь обратиться к объекту, который открыл?Ты добавил объекты в коллекции для какой-то цели...
для меня транзакция это что другое:Что для тебя транзакция - это абсолютно не важно. Ты собираешься программировать для AutoCAD? Вот и разбирайся что такое Transaction в AutoCAD и как с этим можно и нужно работать.
как использовать едитор, если я его ещё не получил или не смог получитьЭто вряд ли. В обычной команде и Document не null и соответственно Editor не null. И если у тебя Document равен null, то у тебя не открыт ни один чертеж и соответственно ты просто должен завершить команду и ничего не выдавать - тебе нечего в такой ситуации делать.
вообще нельзя?
я не пробовал, но имхо с открытием консоли не должно быть проблемА ты попробуй. Воообще-то AutoCAD - не консольное приложение.
е сбрасывать не нужно? а вдруг уже что-то выделенное есть и попадет то, что не должно попасть? или оно само сброситься?Запусти уже наконец свой код в AutoCAD под отладчиком и посмотри что получится.
А ты попробуй. Воообще-то AutoCAD - не консольное приложение.просто консоль не запустилась. хотя не понятно почему я не могу в stdout что-то отправить... фиг с ней, с консолью. убрал все эти проверки.
Запусти уже наконец свой код в AutoCAD под отладчиком и посмотри что получится.это как? ))) "О, сколько нам открытий чудных..." где об этом можно узнать?
Ты добавил объекты в коллекции для какой-то цели...хотите сказать, что за границами операторных скобок ссылки на объекты, которые я получил "битые"? А ObjectId, я так понял, константные и их можно хоть в текстовом файле хранить и при следующем случае получать снова тот же объект по id?
И к тому же нет смысла открывать все подряд entity. Лучше заранее проверить тип ObjectId.ObjectClass.для меня это пустые слова - я искренне не понимаю о чем речь - как на китайском!
А различать ссылки на блок можно не только по имени но и по BlockTableRecord. Предвижу, что далее тебе понадобятся свойства самого блока, а не ссылки - открывай BTR.снова китайская грамота... (
это как?https://docs.microsoft.com/ru-ru/visualstudio/debugger/attach-to-running-processes-with-the-visual-studio-debugger?view=vs-2019
А ObjectId, я так понял, константные и их можно хоть в текстовом файле хранить и при следующем случае получать снова тот же объект по id?нет
хотите сказать, что за границами операторных скобок ссылки на объекты, которые я получил "битые"?да
я искренне не понимаю о чем речьучи dxf
для меня это пустые слова - я искренне не понимаю о чем речь - как на китайском!
хотите сказать, что за границами операторных скобок ссылки на объекты, которые я получил "битые"?Хоспидя... Объекты открытые в транзакции принадлежат ей и диспозятся ей. Как только вы вызываете Commit, Abort или Dispose транзакции (а вы его вызываете не явно, а через using) - объекты уничтожаются. Так что создавайте ваши массивы ВНУТРИ блока using(Transaction...
А ObjectId, я так понял, константные и их можно хоть в текстовом файле хранитьНельзя. У них есть OldIdPtr который уникален во всей БД чертежа, но он меняется при перезагрузках. И есть Handle, который хранится в чертеже, не меняется. Но с ним другая проблема - он не уникален, т.к. объекты во внешних ссылках запросто могут иметь такие же Handle. Если надо сохранять ссылки на объекты чертежа, для этого есть особые типы записей в xData. Но вообще другая тема. Короче, используйте ObjectId так как во всех примерах.
для меня btr - это блок, в первую очередь... а получается, что блок-блок и полилиния - блок... я полагал, что есть таблица блоков, в которой хранятся все блоки и есть бтр - интстанс конкретного блока, а получается, что вообще всё есть btr что ли?Я писал про ссылки на блок (BlockReference). Да btr - это и есть блок. В btr модели и листов хранятся все видимые Entity чертежа. В чертеж (т.е. в BTR "ModelSpace") вставляется ссылка (BlockReference) на блок (BTR). Таким образом получает сколько угодно уровней вложенности блоков в блоки. И один блок (BTR) может быть сколько угодно раз вставлен в чертеж и в другие блоки за счет использования BlockReference.
Вот так, через IsDerivedFrom, можно получить все блоки, плюс массивы, плюс таблицы и все что унаследовано от блоков. Иногда это полезно. Но в данном случае скорее всего нужны именно блоки, заменяем на == или сравниваем типы по имени id.ObjectClass.Name == "AcDbBlockReference"Код - C# [Выбрать]
if (id.ObjectClass.IsDerivedFrom(Rtm.RXObject.GetClass(typeof(Db.BlockReference)))) { }
Вот так, через IsDerivedFrom, можно получить все блоки, плюс массивы, плюс таблицы и все что унаследовано от блоков. Иногда это полезно.Тут немного другое, тут проверяется что объект с заданным id наследован от класса BlockReference. (Дословно Is Derived From == Производный от)
Table унаслендован от BlockReference - соответственно таблицы тоже могут пройти этот фильтр, а это в данном случае лишнее.Вот так, через IsDerivedFrom, можно получить все блоки, плюс массивы, плюс таблицы и все что унаследовано от блоков. Иногда это полезно.Тут немного другое, тут проверяется что объект с заданным id наследован от класса BlockReference. (Дословно Is Derived From == Производный от)