|  | 
 
发表于 2005-8-22 10:47:00
|
显示全部楼层
 
| 这是一本书中的例子,每一行代码的例子我还不太懂,你自己看看吧.其中包括插入块的代码. void insrtBlk()
 {
 char blkName[50];
 AcDbDatabase *pCurDb;
 AcDbBlockTable *pBlkTable;
 AcDbBlockTableRecord *pBlkTableRecord;
 AcDbBlockTableRecord *pBlkDefRecord;
 AcDbBlockReference *pInsrtObj;
 AcDbEntity *pEnt;
 AcDbBlockTableRecordIterator *pIterator;
 AcDbAttributeDefinition *pAttDef;
 AcDbAttribute *pAtt;
 AcDbObjectId blkId;
 AcDbObjectId insrtId;
 char *pTagPrompt;
 AcGePoint3d insPt;
 AcGePoint3d basePt;
 int retCode;
 retCode = acedGetString(0, "\nEnter Block Name: ", blkName);
 if(retCode != RTNORM || blkName[0] == '\0')
 {
 acutPrintf("\nInvalid block name.");
 return;
 }
 pCurDb = acdbHostApplicationServices()->workingDatabase();
 // Check to see if the block table
 // has blkName
 pCurDb->getBlockTable(pBlkTable, AcDb::kForRead);
 if(!pBlkTable->has(blkName))
 {
 acutPrintf("\nBlock definition %s not found. ", blkName);
 pBlkTable->close();
 return;
 }
 // Get the AcDbObjectId of the block
 // definition.
 pBlkTable->getAt(blkName, blkId);
 pBlkTable->getAt(ACDB_MODEL_SPACE, pBlkTableRecord, AcDb::kForWrite);
 pBlkTable->close();
 
 acedInitGet(RSG_NONULL, NULL);
 acedGetPoint(NULL, "\nPick insertion point: ", asDblArray(insPt));
 pInsrtObj = new AcDbBlockReference(insPt, blkId);
 // Here is where you can set scale, rotation and other
 // properties to the block entity. If you want to
 // see the AcDbBlockReference class for more details.
 pBlkTableRecord->appendAcDbEntity(insrtId, pInsrtObj);
 
 acdbOpenObject(pBlkDefRecord, blkId, AcDb::kForRead);
 // Now check to see if the Block Definition
 // has attributes. If it does we will add
 // a Block Table Record Iterator to step through
 // the entities and find the Attribute Definitions.
 if(pBlkDefRecord->hasAttributeDefinitions())
 {
 pBlkDefRecord->newIterator(pIterator);
 for(pIterator->start(); !pIterator->done(); pIterator->step())
 {
 pIterator->getEntity(pEnt, AcDb::kForRead);
 // Check to see if the entity is an
 // attribute definition.
 pAttDef = AcDbAttributeDefinition::cast(pEnt);
 if(pAttDef != NULL && !pAttDef->isConstant())
 {
 // If it is and its not constant
 // create a new attribute
 pAtt = new AcDbAttribute();
 // setPropertiesFrom will copy
 // Color, Layer, Linetype,Linetype scale and
 // Visibility.
 pAtt->setPropertiesFrom(pAttDef);
 // setup more properties from the attribute
 // definition
 pAtt->setInvisible(pAttDef->isInvisible());
 basePt = pAttDef->position();
 basePt += pInsrtObj->position().asVector();
 pAtt->setPosition(basePt);
 pAtt->setHeight(pAttDef->height());
 pAtt->setRotation(pAttDef->rotation());
 // Take note how we get the tag.
 pTagPrompt = pAttDef->tag();
 pAtt->setTag(pTagPrompt);
 free(pTagPrompt);
 // Normally you would prompt the user
 // and ask for input values.
 pTagPrompt = pAttDef->prompt();
 acutPrintf("%s%s", "\n", pTagPrompt);
 free(pTagPrompt);
 
 // The setFieldLength is not required
 // even though it is listed in the
 // documentation.
 pAtt->setFieldLength(25);
 // setTextString is the value the
 // attribute receives which would
 // normally be a user input value.
 pAtt->setTextString("This is a test");
 pInsrtObj->appendAttribute(pAtt);
 pAtt->close();
 }
 pEnt->close();
 }// for
 delete pIterator;
 }// if has attribute definitions
 // Note that we close the Model Space
 // block table record after we have added
 // our attributes.
 pBlkTableRecord->close();
 pInsrtObj->close();
 }
 | 
 |