Тема: objectarx динамические блоки
Подскажите как получить доступ к свойствам ручки растягиваемого динамического блока. Хочу написать программу для растягивания нескольких динамических блоков одновременно рамкой.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → objectarx динамические блоки
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите как получить доступ к свойствам ручки растягиваемого динамического блока. Хочу написать программу для растягивания нескольких динамических блоков одновременно рамкой.
Подскажите как получить доступ к свойствам ручки растягиваемого динамического блока
интересная постановка вопроса :).
тем не менее, любой параметр динамического блока имеет свое имя. собственно говоря, нужно добраться по этому самому имени до его значения (cкорей всего имя - это что-то типа Расстояние1) и модифицировать его.
лениво искать по форуму, но код уже приводился. напрмиер, где-то так:
Acad::ErrorStatus changeBlockDynValue(AcDbObjectId dynblockId, ACHAR * propertyName, double propertyValue) { AcDbObjectPointer<AcDbBlockReference> pBR(dynblockId,AcDb::kForRead); Acad::ErrorStatus es = pBR.openStatus(); if (es == Acad::eWrongObjectType) {return es;} if (es != Acad::eOk) {return es;} AcDbDynBlockReference* pDynBlkRef = new AcDbDynBlockReference(dynblockId); pBR->close(); if (!pDynBlkRef || !pDynBlkRef->isDynamicBlock()) { es = Acad::eInvalidContext; delete pDynBlkRef; return es; } AcDbDynBlockReferencePropertyArray blkPropAry; pDynBlkRef->getBlockProperties(blkPropAry); AcDbDynBlockReferenceProperty blkProp; bool isFindPropName = false; for(long i=0 ; i < blkPropAry.length() ; i++) { blkProp = blkPropAry[i]; if (_tcsicmp(blkProp.propertyName().kACharPtr(), propertyName) != 0) continue; isFindPropName = true; if (blkProp.readOnly()) { es = Acad::eIsWriteProtected; continue; } if ((es = blkProp.setValue(propertyValue)) != Acad::eOk) { continue; } } delete pDynBlkRef; if (!isFindPropName) es = Acad::eInvalidContext; return es; }
вызывается это всё, например, так:
// eId - это ObjectId экземпляра блока, вставленного в чертеж(AcDbBlockReference) changeBlockDynValue(eId,_T("Расстояние1"),250.6f);
Николай, спасибо за ответ, но возможно вы меня не поняли. Мне не нужны свойства параметров (такие как длина). Поэтому поясняю свой вопрос:
1. Как например в пространстве модели с вставленными динамическими блоками найти координаты ручки какого нибудь динамического блока?
2. Как определить допустимый вектор изменения длины блока опять же в пространстве листа или модели?
3. Что такое ручка динамического блока, каким классом описывается?
Смысл захватить рамкой несколько блоков, вычислить ручки которые попали в пределы рамки, узнать векторы допустимых направлений изменений блоков, а потом растягивать.
Не документировано. Открытых классов для таких манипуляций нет.
:) ну если воспользоваться arxdbg на динамическом блоке, то можно многое оттуда почерпнуть
во-первых, есть словарь AcDbBlockRepresentation, в котором есть еще куча всякого хлама. конкретно нас интересует AcDbBlockRepresentation\AppDataCache\ACAD_ENCHANSED(длинное слово, короче)\1
В общем там если порыться, можно вытянуть информацию о всех ручках блока.(все координаты в системе координат блока, так что еще придется трансформировать через матрицу блока, чтоб получить в WCS)
Единственное, что могу сказать - удачи и arxdbg тебе в руки :):):). Так глубоко сам не копал, да и если они там на верху вдруг чего поменяют, проблем не оберешься :).
PS: Не зря оно не документировано
PS2: ну а как это растягивать, я уже написал. единственное что, у меня все параметры дабловые, так что проверок на воответствие типов нет.
А можно ли создать динамический блок програмно (без команд) например с параметром растяжения. Для меня здесь трудность в создании самого параметра.
трудность в создании самого параметра.
в этом и заключается основная фишка автодеска. клонов автокада куча, но с динамичностью у них проблемы. врядли скоро в открытом доступе (в ObjectARX) появится возможность создавать саму динамичность :) для блоков. максимум что можно сделать на данный момент - менять значение параметров вставленного в чертеж динамического блока.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → objectarx динамические блоки
Форум работает на PunBB, при поддержке Informer Technologies, Inc