ObjectARX
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

how to use the Dynamic Blocks in objectarx2010?

11 REPLIES 11
SOLVED
Reply
Message 1 of 12
zhangxinhua789
2186 Views, 11 Replies

how to use the Dynamic Blocks in objectarx2010?

Hello,experts
I have a new question,I want to know how to use the Dynamic Blocks in objectarx2010. I define a Dynamic Block in autocad2010,Now I want to insert the Dynamic Block in a dwg-file,can you tell me the code。

Thank you very much!

11 REPLIES 11
Message 2 of 12

Hello,experts
  I have a new question,I want to know how to use the Dynamic Blocks in objectarx2010. I define a Dynamic Block in autocad2010,Now I want to insert the Dynamic Block in a dwg-file,can you tell me the  code?               Thank you very much!

 

  this is a screenshot of the Dynamic Blocks,I want to insert the Dynamic Block in the position(x=50,y=50),and I want change the three dimensions:

before command:they are d1=48;d2=96;d3=43
after    command:they are d1=98;d2=150;d3=70

And I have attached this dwg-file in my post in order to you can test your code with it (I have defined the the Dynamic Block,its name is a ; you can try to insert it in autocad2010).
I think the class of AcDbDynBlockReference is useful,but I don't know how to use it.Can you help me?

 

Edited by
Discussion_Admin

Message 3 of 12

Hello,experts
I have a new question,I want to know how to use the Dynamic Blocks in objectarx2010. I define a Dynamic Block in autocad2010,Now I want to insert the Dynamic Block in a dwg-file,can you tell me the code,Thank you very much!

this is a screenshot of the Dynamic Blocks,I want to insert the Dynamic Block in the coordinate

position(x=50,y=50),and I want change the three dimensions:
before command:they are d1=48;d2=96;d3=43
after  command:they are d1=98;d2=150;d3=70

And I have attached this dwg-file in my post in order to you can test your code with it(I have

defined the the Dynamic Block,its name is a;you can try to insert it in autocad2010).
I think the class of AcDbDynBlockReference is useful,but I don't know how to use it.Can you help me?

Message 4 of 12

// (C) Copyright 2002-2007 by Autodesk, Inc. 
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted, 
// provided that the above copyright notice appears in all copies and 
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting 
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC. 
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to 
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//

//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include <AcDbAssocNetwork.h>
#include <AcDbAssocVariable.h>
#include <dbdimassoc.h>
#include "resource.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("")


//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CTestAssocApp : public AcRxArxApp {

public:
    CTestAssocApp () : AcRxArxApp () {}

    virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
        // TODO: Load dependencies here

        // You *must* call On_kInitAppMsg here
        AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;

        // TODO: Add your initialization code here

        return (retCode) ;
    }

    virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
        // TODO: Add your code here

        // You *must* call On_kUnloadAppMsg here
        AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

        // TODO: Unload dependencies here

        return (retCode) ;
    }

    virtual void RegisterServerComponents () {
    }

    static void ListVarsInNetwork(const AcDbAssocNetwork *pNet)
    {
        AcDbObjectIdArray idsActions = pNet->getActions();
        for (int i = 0; i < idsActions.length(); i++) {
            AcDbObjectPointer<AcDbAssocAction> pAction(idsActions[i],AcDb::kForRead);
            if (pAction.openStatus() == Acad::eOk) {
                AcDbAssocNetwork  *pNetSub = AcDbAssocNetwork::cast(pAction.object());
                AcDbAssocVariable *pVar = AcDbAssocVariable::cast(pAction.object());
                if (pNetSub)  {
                    ListVarsInNetwork(pNetSub);
                }  else if (pVar) {
                    acutPrintf(_T("\nVariable Name=%s Value=%s"), 
                        pVar->name().kACharPtr(), pVar->expression().kACharPtr());
                }
            }
        }
    }

    static int GetVars(const AcDbAssocNetwork *pNet, AcStringArray &names, AcDbObjectIdArray &ids)
    {
        AcDbObjectIdArray idsActions = pNet->getActions();
        for (int i = 0; i < idsActions.length(); i++) {
            AcDbObjectPointer<AcDbAssocAction> pAction(idsActions[i],AcDb::kForRead);
            if (pAction.openStatus() == Acad::eOk) {
                AcDbAssocVariable *pVar = AcDbAssocVariable::cast(pAction.object());
                if (pVar) {
                    names.append(pVar->name());
                    ids.append(pVar->objectId());
                }
            }
        }
        return ids.length();
    }

    //
    //  Command list all AssocVariable
    //
    static void TestAssocListAssocVars(void)
    {
        AcDbObjectId idNet = AcDbAssocNetwork::getInstanceFromDatabase(acdbCurDwg(),true);
        AcDbObjectPointer<AcDbAssocNetwork> pNet(idNet,AcDb::kForRead);
        if (pNet.openStatus() != Acad::eOk) return;
        ListVarsInNetwork(pNet.object());
    }

    //
    // Command Add new AssocVariable or change existent
    //
    static void TestAssocAddAssocVar(void)
    {
        // Add your code for command TestAssoc.AddAssocVar here
        Acad::ErrorStatus es;
        AcDbDatabase *pCurDb = acdbCurDwg();
        AcDbObjectId idNet = AcDbAssocNetwork::getInstanceFromDatabase(pCurDb,true);
        AcDbObjectPointer<AcDbAssocNetwork> pNetMain(idNet,AcDb::kForRead);
        if (pNetMain.openStatus() != Acad::eOk) return;
        AcDbObjectIdArray ids = pNetMain->getActions();
        AcDbObjectId idNetSub;
        if (ids.length() == 0) {
            AcDbAssocNetwork *pNetSub = new AcDbAssocNetwork();
            if (pNetMain->upgradeOpen() == Acad::eOk) {
                if (pCurDb->addAcDbObject(idNetSub,pNetSub) == Acad::eOk) {
                    pNetSub->addAction(idNetSub,true);
                    pNetSub->close();
                } else {
                    delete pNetSub;
                }
                pNetMain->downgradeOpen();
            }
        } else {
            idNetSub = ids[0];
        }
        ACHAR name[512], val[512];
        if (acedGetString(TRUE,_T("Variable name: "), name) != RTNORM ||
            acedGetString(TRUE,_T("Variable expression: "), val) != RTNORM) {
                return;
        }
        AcDbObjectPointer<AcDbAssocNetwork> pNet(idNetSub,AcDb::kForWrite);
        if (pNet.openStatus() != Acad::eOk) return;
        AcString nameStr = name, valStr = val, errorMsg;
        AcStringArray sVarNames; 
        AcDbObjectIdArray idsVars;
        GetVars(pNet.object(), sVarNames, idsVars);
        int ivar = 0;

        if (sVarNames.find(name, ivar)) {
            // Variable exist - change it
            AcDbObjectPointer<AcDbAssocVariable> pVar(idsVars[ivar], AcDb::kForWrite);
            if (pVar.openStatus() == Acad::eOk) {
                if (pVar->validateNameAndExpression(name,val,errorMsg) != Acad::eOk) {
                    acutPrintf(_T("\nError %s"), errorMsg.kACharPtr());
                    return;
                }

                if ((es = pVar->setExpression(valStr,_T(""),true,true,errorMsg,true)) != Acad::eOk) {
                    acutPrintf(_T("\npVar->setExpression(valStr))=%s error=%s"),\
                        acadErrorStatusText(es), errorMsg.kACharPtr());
                    return;
                }
            }
        } else {
            AcDbAssocVariable *ppVar = new AcDbAssocVariable();
            AcDbObjectId idVar;
            if (pCurDb->addAcDbObject(idVar,ppVar) == Acad::eOk) {
                ppVar->close();
                pNet->addAction(idVar,true);
            } else {
                delete ppVar; return;
            }

            AcDbObjectPointer<AcDbAssocVariable> pVar(idVar, AcDb::kForWrite);
            if (pVar.openStatus() == Acad::eOk) {
                if (pVar->validateNameAndExpression(name,val,errorMsg) != Acad::eOk) {
                    acutPrintf(_T("\npVar->validateNameAndExpression(name,val,errorMsg) =  %s"), errorMsg.kACharPtr());
                    pVar->close();
                    pNet->removeAction(idVar,true);
                    return;
                }

                if ((es = pVar->setName(nameStr,true)) != Acad::eOk) {
                    acutPrintf(_T("\npVar->setName(nameStr,true)=%s error=%s"),\
                        acadErrorStatusText(es), errorMsg.kACharPtr());
                    pVar->close();
                    pNet->removeAction(idVar,true);
                    return;
                }

                if ((es = pVar->setExpression(valStr,_T(""),true,true,errorMsg,true)) != Acad::eOk) {
                    acutPrintf(_T("\npVar->setExpression(valStr))=%s error=%s"),\
                        acadErrorStatusText(es), errorMsg.kACharPtr());
                    pVar->close();
                    pNet->removeAction(idVar,true);
                    return;
                }
            }

        }
    }

    // - TestAssoc.ChgBlockVar command (do not rename)
    static void TestAssocChgBlockVar(void)
    {
        Acad::ErrorStatus es;
        ads_name en; ads_point p;
        AcString errorMsg;
        AcStringArray sVarNames; 
        AcDbObjectIdArray idsVars;
        if (acedEntSel(_T("\nSelect dynamic block: "), en, p) != RTNORM) return;
        AcDbObjectId eidBref; acdbGetObjectId(eidBref, en);
        ACHAR name[512], val[512];
        if (acedGetString(TRUE,_T("Variable name: "), name) != RTNORM ||
            acedGetString(TRUE,_T("Variable expression: "), val) != RTNORM) {
                return;
        }
        AcDbObjectId idNet;
        AcDbVoidPtrArray *reactors = NULL;
        {
            {
                AcDbObjectPointer<AcDbBlockReference> pBref(eidBref, AcDb::kForRead);
                if (pBref.openStatus() != Acad::eOk) return;
                idNet = AcDbAssocNetwork::getInstanceFromObject(pBref.object()->blockTableRecord(),true);
                reactors = pBref->reactors();
            }
            if (idNet.isNull()) {
                acutPrintf(_T("\nNo variables")); return;
            }
            {
                AcDbObjectPointer<AcDbAssocNetwork> pNetMain(idNet,AcDb::kForRead);
                if (pNetMain.openStatus() != Acad::eOk) return;
                AcDbObjectIdArray ids = pNetMain->getActions();
                if (ids.length() == 0) return;
                GetVars(pNetMain.object(), sVarNames, idsVars);
            }

        }
        int ivar = 0;
        if (sVarNames.find(name, ivar)) {
            // Variable exist - change it
            AcDbObjectPointer<AcDbAssocVariable> pVar(idsVars[ivar], AcDb::kForWrite);
            if (pVar.openStatus() == Acad::eOk) {
                if (pVar->validateNameAndExpression(name,val,errorMsg) != Acad::eOk) {
                    acutPrintf(_T("\nError %s"), errorMsg.kACharPtr());
                    return;
                }
                if ((es = pVar->setExpression(val,_T(""),true,true,errorMsg,true)) != Acad::eOk) {
                    acutPrintf(_T("\npVar->setExpression(valStr))=%s error=%s"),
                        acadErrorStatusText(es), errorMsg.kACharPtr());
                    return;
                }
                AcDbEvalVariant valvar;
                if ((es = pVar->evaluateExpression(valvar)) != Acad::eOk) {
                    acutPrintf(_T("\npVar->evaluateExpression(valvar))=%s error=%s"),
                        acadErrorStatusText(es), errorMsg.kACharPtr());
                    return;
                }
                if ((es = pVar->setValue(valvar)) != Acad::eOk) {
                    acutPrintf(_T("\npVar->setValue(valvar))=%s error=%s"),
                        acadErrorStatusText(es), errorMsg.kACharPtr());
                    return;
                }
                pVar->evaluateDependencies();
            }
            {
                AcDbObjectPointer<AcDbBlockReference> pBref(eidBref, AcDb::kForWrite);
                if (pBref.openStatus() != Acad::eOk) return;
                pBref->assertWriteEnabled(true);
            }
            void *pSomething = NULL;
            if (reactors != NULL) {
                for (int j = 0; j <= 1; j++) {
                    for (int i=0; i < reactors->length(); i++) {
                        pSomething = reactors->at(i);
                        AcDbObjectId idReact = acdbPersistentReactorObjectId(pSomething);
                        if (!idReact.isNull()) {
                            AcDbObjectPointer<AcDbDimAssoc> pDimAssoc(idReact,AcDb::kForWrite);
                            if (pDimAssoc.openStatus() != Acad::eOk) continue;
                            pDimAssoc->updateDimension(true,true);
                            AcDbObjectIdArray idsAss; pDimAssoc->getDimAssocGeomIds(idsAss);
                            if (idsAss.length() > 0) {
                                pDimAssoc->updateAssociativity(idsAss);
                            }
                        }
                    }
                }
            }

        } else {
            acutPrintf(_T("\nNot found variable %s"), name); return;            
        }
    }
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CTestAssocApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CTestAssocApp, TestAssoc, ListAssocVars, ListAssocVars, ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CTestAssocApp, TestAssoc, AddAssocVar, AddAssocVar, ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CTestAssocApp, TestAssoc, ChgBlockVar, ChgBlockVar, ACRX_CMD_TRANSPARENT, NULL)

Command ChgBlockVar.

P.S.: I hope that in the future you will not repeat the same questions several times in different topics and write me private messages several times. If it happens again, then I raised you to ignore list.

 

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 5 of 12

 Thank you for your forgiveness!

Best wishes!

Message 6 of 12

hello,I am sorry,but your code can't achieve my aim.

I think the code like this probablely ,but the code still can't achieve my aim,the three dimensions are still:

d1=48;d2=96;d3=43.

Can you tell my  mistake?

 

 

 

static void aeastone(void)

{      AcTransaction* pTrans = actrTransactionManager->startTransaction();

  AcDbObjectId blkTabId = acdbHostApplicationServices()->workingDatabase()->blockTableId();   AcDbBlockTable* pBlkTab = NULL;   pTrans->getObject((AcDbObject*&)pBlkTab, blkTabId, AcDb::kForRead);//

  if(pBlkTab->has(_T("a")))   {    AcDbObjectId blockId;    AcDbBlockTableRecord* pBlock = NULL;    pBlkTab->getAt(_T("a"), blockId);

   AcDbBlockReference* pRef = new AcDbBlockReference(AcGePoint3d(0,0,0), blockId);

   AcDbObjectId msId;    AcDbBlockTableRecord* pMS = NULL;    pBlkTab->getAt(ACDB_MODEL_SPACE, msId);    pTrans->getObject((AcDbObject*&)pMS, msId, AcDb::kForWrite);

   // Add the block reference to the dwg/database first!!!!    pMS->appendAcDbEntity(pRef);    actrTransactionManager->addNewlyCreatedDBRObject(pRef);

   // Check to make sure it is a dynamic block    AcDbDynBlockReference dynBlkRef(pRef->id());    if(dynBlkRef.isDynamicBlock())    {      AcDbDynBlockReferencePropertyArray propArr;     dynBlkRef.getBlockProperties(propArr);     short a=98;     acutPrintf(_T("\n the length is %d"), propArr.length());//2

    for(int i = 0; i < propArr.length(); i++)     {      AcDbDynBlockReferenceProperty prop = propArr.at(i);      AcDbEvalVariant val = prop.value();              if(val.restype == 40)      {      AcDbEvalVariant visVal(a);      prop.setValue(visVal);               }     }    }   }

  actrTransactionManager->endTransaction();  }

Message 7 of 12

Hello,expert

I have  build your code and I have run command ChgBlockVar,

but the result is not my purpose.

Message 8 of 12

I'll see your's code when I have free time. In the meantime, learn to use the button Insert Code:   

01-03-2013 15-59-28.png

 

It is impossible to read your's code. Smiley Mad

 

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 9 of 12

static void ABCV(void)
{
    AcDbDatabase *pCurDb = acdbCurDwg();
    AcDbObjectId idCurSpace = pCurDb->currentSpaceId();
    ACHAR blockName[512] = _T("");
    if (acedGetString(TRUE, _T("\nEnter block name: "),blockName) != RTNORM) 
        return;
    AcGePoint3d pIns;
    if (acedGetPoint(NULL,_T("\nEnter position: "),asDblArray(pIns)) != RTNORM) 
        return;
    AcGeMatrix3d matUCS; acedGetCurrentUCS(matUCS); pIns.transformBy(matUCS);
    AcDbObjectId idBTR;
    {
        AcDbBlockTableRecordPointer pBTR(blockName, pCurDb, AcDb::kForRead);
        if (pBTR.openStatus() != Acad::eOk) {
            acutPrintf(_T("\nBlock <%s> not found!"), blockName);
            return;
        }
        idBTR = pBTR->objectId();
    }

    AcDbObjectPointer<AcDbBlockReference> pBref; pBref.create();
    pBref->setBlockTableRecord(idBTR);
    pBref->setPosition(pIns);
    AcDbObjectId idBref;
    {
        AcDbBlockTableRecordPointer pBTRCurSpace(idCurSpace, AcDb::kForWrite);
        if (pBTRCurSpace.openStatus() != Acad::eOk) return;
        pBTRCurSpace->appendAcDbEntity(idBref,pBref);
    }

    // NOTE: Skip adding attributes to block reference

    AcDbDynBlockReference pDynRef(pBref);
    if (!pDynRef.isDynamicBlock()) {
        acutPrintf(_T("\nBlock <%s> is not dynamic!"), blockName);
        return;
    }
    AcDbDynBlockReferencePropertyArray propArr;
    pDynRef.getBlockProperties(propArr);
    // Array of variable names
    AcStringArray varNames; 
    varNames.append(_T("d1")); 
    varNames.append(_T("d2")); 
    varNames.append(_T("d3"));
    ACHAR buf[512]; 
    for (int i = 0; i < propArr.length(); i++) {
        AcDbDynBlockReferenceProperty prop = propArr[i];
        AcDbEvalVariant pValVar = prop.value();
        int iVar = 0;
        if (varNames.find(prop.propertyName(),iVar)) {
            _stprintf(buf,_T("\nNew value of %s <%g>: "), 
                prop.propertyName().kACharPtr(), 
                pValVar.resval.rreal);
            acedInitGet(RSG_NOZERO | RSG_NONEG, NULL);
            // We know all our variables are double. 
            double newVal = pValVar.resval.rreal;
            int rc = acedGetReal(buf, &newVal);
            if (rc == RTCAN) return;
            pValVar.resval.rreal = newVal;
            prop.setValue(pValVar);
        }
    }
}

 02-03-2013 1-33-04.png

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 10 of 12

Thank you very much! you are my mentor! best wishes!
Message 11 of 12

Hello,experts
I have a similar question,It's about "Block Properties Table",I want to use a Block Properties Table to manage a Dynamic Block.I have defiened a Dynamic Block and its Block Properties Table in Autocad2010,this is the screenshot of the Block Properties Table(a1:d1=100,d2=200;a2:d1=100,d2=400;a3:d1=100,d2=600;).
Now I want to insert the Dynamic Block using objectarx2010.after I input a command,the block of a2(d1=100,d2=400) is inserted.

I have written the code,but the code still can't achieve my aim,Can you tell my  mistake?Thank you very much!

2.png

static void aeastbbb(void)
 {
  AcTransaction* pTrans = actrTransactionManager->startTransaction();

  AcDbObjectId blkTabId = acdbHostApplicationServices()->workingDatabase()->blockTableId();
  AcDbBlockTable* pBlkTab = NULL;
  pTrans->getObject((AcDbObject*&)pBlkTab, blkTabId, AcDb::kForRead);

  if(pBlkTab->has(_T("c")))
  {
   AcDbObjectId blockId;
   AcDbBlockTableRecord* pBlock = NULL;
   pBlkTab->getAt(_T("c"), blockId);

   AcDbBlockReference* pRef = new AcDbBlockReference(AcGePoint3d(0,0,0), blockId);

   AcDbObjectId msId;
   AcDbBlockTableRecord* pMS = NULL;
   pBlkTab->getAt(ACDB_MODEL_SPACE, msId);
   pTrans->getObject((AcDbObject*&)pMS, msId, AcDb::kForWrite);

   // Add the block reference to the dwg/database first!!!!
   pMS->appendAcDbEntity(pRef);
   actrTransactionManager->addNewlyCreatedDBRObject(pRef);

   // Check to make sure it is a dynamic block
   AcDbDynBlockReference dynBlkRef(pRef->id());
   if(dynBlkRef.isDynamicBlock())
   {
    // These are the names of the available visibilty states
    //AcArray visNames;
    AcStringArray varNames,visNames;
    visNames.append(_T("a1"));
    visNames.append(_T("a2"));
    visNames.append(_T("a3"));
    varNames.append(_T("user1"));

    AcDbDynBlockReferencePropertyArray propArr;
    dynBlkRef.getBlockProperties(propArr);
    acutPrintf(_T("\n the length is %d"), propArr.length());//

    for(int i = 0; i < propArr.length(); i++)
    {
     AcDbDynBlockReferenceProperty prop = propArr.at(i);
     AcDbEvalVariant val = prop.value();
     int iVar = 0;
     acutPrintf(_T("\npropertyName is  %s "), prop.propertyName());
    if (varNames.find(prop.propertyName(),iVar))
    {
     acutPrintf(_T("\npropertyName is  %s "), prop.propertyName());
     acutPrintf(_T("\n the length is %d"), iVar);//
     acutPrintf(_T("\n zhangzhang !!!!!!!!!!"));

     AcDbEvalVariantArray allowedVals;
     prop.getAllowedValues(allowedVals);
     acutPrintf(_T("\n the allowedVals is %d"), allowedVals.length());//
     AcDbEvalVariant visVal(visNames.at(2));
       prop.setValue(visVal);
      }
   }
   }
  }

  actrTransactionManager->endTransaction();
}

 

 

 

 

 

 

 

 

 

 

Message 12 of 12

Hello,experts
I have a similar question,It's about "Block Properties Table",I want to use a Block Properties Table to manage a Dynamic Block.I have defiened a Dynamic Block and its Block Properties Table in Autocad2010,this is the screenshot of the Block Properties Table(a1:d1=100,d2=200;a2:d1=100,d2=400;a3:d1=100,d2=600;).
Now I want to insert the Dynamic Block using objectarx2010.after I input a command,the block of a2(d1=100,d2=400) is inserted.

I have written the code,but the code still can't achieve my aim,Can you tell my  mistake?Thank you very much!

 

 

this is the code:

 

static void aeastbbb(void)
 {
  AcTransaction* pTrans = actrTransactionManager->startTransaction();

  AcDbObjectId blkTabId = acdbHostApplicationServices()->workingDatabase()->blockTableId();
  AcDbBlockTable* pBlkTab = NULL;
  pTrans->getObject((AcDbObject*&)pBlkTab, blkTabId, AcDb::kForRead);

  if(pBlkTab->has(_T("c")))
  {
   AcDbObjectId blockId;
   AcDbBlockTableRecord* pBlock = NULL;
   pBlkTab->getAt(_T("c"), blockId);

   AcDbBlockReference* pRef = new AcDbBlockReference(AcGePoint3d(0,0,0), blockId);

   AcDbObjectId msId;
   AcDbBlockTableRecord* pMS = NULL;
   pBlkTab->getAt(ACDB_MODEL_SPACE, msId);
   pTrans->getObject((AcDbObject*&)pMS, msId, AcDb::kForWrite);

   // Add the block reference to the dwg/database first!!!!
   pMS->appendAcDbEntity(pRef);
   actrTransactionManager->addNewlyCreatedDBRObject(pRef);

   // Check to make sure it is a dynamic block
   AcDbDynBlockReference dynBlkRef(pRef->id());
   if(dynBlkRef.isDynamicBlock())
   {
    // These are the names of the available visibilty states
    //AcArray visNames;
    AcStringArray varNames,visNames;
    visNames.append(_T("a1"));
    visNames.append(_T("a2"));
    visNames.append(_T("a3"));
    varNames.append(_T("user1"));

    AcDbDynBlockReferencePropertyArray propArr;
    dynBlkRef.getBlockProperties(propArr);
    acutPrintf(_T("\n the length is %d"), propArr.length());//

    for(int i = 0; i < propArr.length(); i++)
    {
     AcDbDynBlockReferenceProperty prop = propArr.at(i);
     AcDbEvalVariant val = prop.value();
     int iVar = 0;
     acutPrintf(_T("\npropertyName is  %s "), prop.propertyName());
    if (varNames.find(prop.propertyName(),iVar))
    {
     acutPrintf(_T("\npropertyName is  %s "), prop.propertyName());
     acutPrintf(_T("\n the length is %d"), iVar);//
     acutPrintf(_T("\n zhangzhang !!!!!!!!!!"));

     AcDbEvalVariantArray allowedVals;
     prop.getAllowedValues(allowedVals);
     acutPrintf(_T("\n the allowedVals is %d"), allowedVals.length());//
     AcDbEvalVariant visVal(visNames.at(2));
       prop.setValue(visVal);
}
}
   }
  }

  actrTransactionManager->endTransaction();


}


 

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report

”Boost