|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как узнать где во вставляемом блоке находится точка вставки относительно общих размеров?
Регистрация: 19.12.2011
Сообщений: 35
|
||
Просмотров: 6348
|
|
||||
Следует отличать понятие определение блока от понятия вхождение блока. Насколько я тебя понял - ты имеешь в виду второй вариант. Тогда смотри свойство BlockReference.Position. Не ленись заглядывать в документацию по ObjectARX.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
специалист по околачиванию грушевых деревьев Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811
|
Цитата:
а вставку блока в таблицу через ObjectId этого блока: Код:
Код:
Последний раз редактировалось Олег (jr.), 04.07.2012 в 00:02. |
|||
![]() |
|
||||
Регистрация: 19.12.2011
Сообщений: 35
|
Уважаемые участники форума!
Я наверное не правильно выразился! Я знаю как импортировать определение блока из другого чертежа и знаю как создать ссылку для вхождения блока........ Основная проблема в том что я при вставке не могу точно попасть в таблицу которая в текущем чертеже! Потому что точка вставки у самого блока может быль где угодно! Одни блоки созданы с точкой для вставки в правом верхнем углу, вторые блоки созданы с точкой для вставки в левом нижнем углу, а остальные блоки созданы с точкой для вставки где-то посредине......... Где какие блоки не известно! Они все вперемешку..... Задача стоит в том что-бы их перед вставкой как то программно позиционировать, что бы они точно влазили в таблицу....... Вот! |
|||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
Вариантов два, если блок не динамический, то у BlockTableRecord есть свойство Origin - оно отвечает за точку вставки блока. Если блок динамический, то возможна ситуация, что определение блока содержит динамический параметр Basepoint, до него можно добраться перебрав у вхождения блока его DynamicBlockReferencePropertyCollection.
Быстрый эксперимент показал, что этому параметру соответствует DynamicBlockReferenceProperty с PropertyName = Origin и PropertyTypeCode = 12, вот только в Value он содержит смещение от своего положения до BlockTableRecord.Origin, похоже.. А дальше уже дело техники определить где полученная точка вставки относительно остальной геометрии в блоке. Возможно, есть более простой и правильный путь, конечно. |
|||
![]() |
|
||||
Регистрация: 19.12.2011
Сообщений: 35
|
Спасибо за ответы!
А можно в коде...... Если не сложно! Хотя бы частично.... Я не очень опытный программист...... Мне в коде будет легче понять! Блоки у меня обычные не динамические! Три дня про ковырялся, что то не могу понять! Заранее спасибо! P.S. Извините за долгий ответ, я был послан в командировку...... ![]() |
|||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
Так где конкретно затык? Границы геометрии внутри блока можно определить грубо с помощью GeometricExtents. Т.е. пробегаешься по всем объектам внутри блока, получаешь их GeometricExtents.MaxPoint и GeometricExtents.MinPoint, ищешь максимальную/минимальную точки в целом, отсюда получаешь геометрический центр твоих объектов (или какую точку хочешь получить), ну и смотришь смещение относительно origin
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
bargool, забыл про атрибуты.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.12.2011
Сообщений: 35
|
Мне кажется в моих экспериментах много бреда.......
![]() По этому я решил не позорится....... ![]() Теперь все стало немного понятней! Перебрать объекты блока можно так....... На сколько я понял! Код:
Делать для каждого элемента вхождение?????? ![]() |
|||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
Так, возвращаемся к основам. Этот документ читал? Его перевод у hwd. Далее есть SDK - очень полезная штука.
GeometricExtents - свойство у видимых объектов автокада, т.е. его имеют все объекты по иерархии начиная от Entity. т.о., в своём цикле можешь получить Код:
![]() Последний раз редактировалось bargool, 18.07.2012 в 10:42. |
|||
![]() |
|
||||
Регистрация: 19.12.2011
Сообщений: 35
|
Эти ресурсы я почитываю, периодически.....Но частями! По мере надобности!
Но полностью я их не изучил. Времени никак выделить не могу..... "Любимая" работа не позволяет! У меня возникла очередная проблема: Код:
При вызове происходит исключение eNullExtents и возвращается ноль....... Похоже я где-то налажал! ![]() |
|||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
так вот наверное, что имел в виду Кулик Алексей aka kpblc!
ошибка выскакивает при появлении определений атрибутов в определении блока Кстати, я туплю. Ведь можно вставить блок, а затем проверить его GeometricExtents, они не учитывают точку вставки, а учитывают именно геометрию. А точку вставки определить по свойству Position BlockReference Последний раз редактировалось bargool, 18.07.2012 в 15:13. |
|||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
Во первых, OpenMode.ForWrite - открытие объекта для записи, операция значительно более длительная, чем для чтения OpenMode.ForRead, да ещё и для каждого объекта может выполняться один раз одновременно. Если не планируется ничего изменять - лучше открывать для чтения. Если менять только некоторые объекты, по условию, то можно вначале открывать для чтения, проверять, нужны ли изменения, а потом уже использовать метод UpgradeOpen().
Во вторых, можно сразу проверять на entity is AttributeDefinition, незачем 2 раза для этого открывать объект. В третьих, познай силу LINQ, люк ![]() Код:
По поводу "А как при добавленной ссылке "поправить" блок? Ссылка то уже добавлена!? И блок уже получается вставлен!" - изучай мат. часть. При изменении определения блока меняются и вхождения блоков. В том и смысл. Правда, как всегда с автокадом, с оговорками. Отдельно надо отслеживать вхождения атрибутов и динамику Да! Забыл про в четвёртых: ты инициализировал YMax = 0, а ведь геометрия блока может быть ниже нуля Последний раз редактировалось bargool, 18.07.2012 в 17:31. Причина: Добавил про изменения блоков и много чего ещё |
|||
![]() |
|
||||
Регистрация: 19.12.2011
Сообщений: 35
|
Цитата:
Уже читаю мастер Оби Ван ![]() Похоже мощная штука......... Цитата:
![]() Цитата:
Спасибо всем за наставления и отдельное СПАСИБО bargool-у! Теперь есть информация для размышления и изучения! ![]() Проблема решилась следующим способом! Создаю вхождение блока (BlockReference) => Получаю его GeometricExtents.MaxPoint и GeometricExtents.MinPoint => Используя координаты внешней точки вставки, определяю на сколько нужно сместить и куда => Получаю Point3d => И присваиваю Point3d свойству Position того же вхождения (BlockReference) перед выводом! И работает! ![]() |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблемы с расчетом Ж/Б каркаса в ANSYS | derik | ANSYS | 457 | 04.07.2017 16:16 |