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!
Solved! Go to Solution.
Solved by Alexander.Rivilis. Go to Solution.
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
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?
// (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
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(); }
Hello,expert
I have build your code and I have run command ChgBlockVar,
but the result is not my purpose.
I'll see your's code when I have free time. In the meantime, learn to use the button Insert Code:
It is impossible to read your's code.
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | 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
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); } } }
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | 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
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!
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();
}
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();
}