Тема: objectarx динамические блоки

Подскажите как получить доступ к свойствам ручки растягиваемого динамического блока. Хочу написать программу для растягивания нескольких динамических блоков одновременно рамкой.

Re: objectarx динамические блоки

Подскажите как получить доступ к свойствам ручки растягиваемого динамического блока

интересная постановка вопроса :).

тем не менее, любой параметр динамического блока имеет свое имя. собственно говоря, нужно добраться по этому самому имени до его значения (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);

Re: objectarx динамические блоки

Николай, спасибо за ответ, но возможно вы меня не поняли. Мне не нужны свойства параметров (такие как длина). Поэтому поясняю свой вопрос:
1. Как например в пространстве модели с вставленными динамическими блоками найти координаты ручки какого нибудь динамического блока?
2. Как определить допустимый вектор изменения длины блока опять же в пространстве листа или модели?
3. Что такое ручка динамического блока, каким классом описывается?

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

Re: objectarx динамические блоки

Не документировано. Открытых классов для таких манипуляций нет.

Re: objectarx динамические блоки

:) ну если воспользоваться arxdbg на динамическом блоке, то можно многое оттуда почерпнуть
во-первых, есть словарь AcDbBlockRepresentation, в котором есть еще куча всякого хлама. конкретно нас интересует AcDbBlockRepresentation\AppDataCache\ACAD_ENCHANSED(длинное слово, короче)\1
В общем там если порыться, можно вытянуть информацию о всех ручках блока.(все координаты в системе координат блока, так что еще придется трансформировать через матрицу блока, чтоб получить в WCS)

Единственное, что могу сказать - удачи и arxdbg тебе в руки :):):). Так глубоко сам не копал, да и если они там на верху вдруг чего поменяют, проблем не оберешься :).
PS: Не зря оно не документировано

PS2: ну а как это растягивать, я уже написал. единственное что, у меня все параметры дабловые, так что проверок на воответствие типов нет.

Re: objectarx динамические блоки

Спасибо, буду пробовать.

Re: objectarx динамические блоки

А можно ли создать динамический блок програмно (без команд) например с параметром растяжения. Для меня здесь трудность в создании самого параметра.

Re: objectarx динамические блоки

трудность в создании самого параметра.

в этом и заключается основная фишка автодеска. клонов автокада куча, но с динамичностью у них проблемы. врядли скоро в открытом доступе (в ObjectARX) появится возможность создавать саму динамичность :) для блоков. максимум что можно сделать на данный момент - менять значение параметров вставленного в чертеж динамического блока.