- UID
- 674793
- 积分
- 1875
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2013-4-1
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
 - //选择物体添加到块中,支持对不等比图块添加物体
- void XL_Add2Block (void)
- {
- ads_name BlkRef,ss;
- ads_point selPt;
- AcDbBlockTable *pBlockTable;
- //pBlockTableRec 要修改的块表记录
- //pUnBlockTableRec 无名块的块表记录
- //pBlockTableRecord 当前空间块表记录
- AcDbBlockTableRecord *pBlockTableRec,*pUnBlockTableRec,*pBlockTableRecord;
- AcDbObjectId BlkRefId,pBlockTableRecId,pUnBlockTableRecId;
- AcDbEntity *pBlkRefEnt;
- AcDbBlockReference *pBlockRef;
- if (RTNORM != acedEntSel(_T("\n选择图块:"),BlkRef,selPt))
- {
- return;
- }
- acedRedraw(BlkRef,3);
- acdbGetObjectId(BlkRefId,BlkRef);
- Acad::ErrorStatus es = acdbOpenObject(pBlkRefEnt,BlkRefId,AcDb::kForWrite);
- if (es != Acad::eOk)
- {
- acedRedraw(BlkRef,4);
- return;
- }
- if (!pBlkRefEnt->isKindOf(AcDbBlockReference::desc()))
- {
- pBlkRefEnt->close();
- acedRedraw(BlkRef,4);
- return;
- }
- pBlockRef = AcDbBlockReference::cast(pBlkRefEnt);
- //BlockDefId = pBlockRef->blockId();
- if (RTNORM != acedSSGet(_T(":L"),NULL,NULL,NULL,ss))
- {
- pBlkRefEnt->close();
- acedRedraw(BlkRef,4);
- return;
- }
- acedSSDel(BlkRef,ss);
- long len;
- acedSSLength(ss,&len);
- if (len < 1)
- {
- acdbFail(_T("没有选择实体!"));
- pBlkRefEnt->close();
- acedRedraw(BlkRef,4);
- return;
- }
-
- pBlockTableRecId = pBlockRef->blockTableRecord();
- if (Acad::eOk != acdbOpenObject(pBlockTableRec,pBlockTableRecId,AcDb::kForWrite))
- {
- pBlockTableRec->close();
- pBlkRefEnt->close();
- acedRedraw(BlkRef,4);
- return;
- }
- AcGeMatrix3d mat,invmat,mat1,mat2;
- AcGeVector3d xAxis(1,0,0),zAxis(0,0,1);
- AcGePoint3d Refposion = pBlockRef->position();
- AcGeVector3d vec(-Refposion.x,-Refposion.y,-Refposion.z);
- AcGeScale3d Refscale3d = pBlockRef->scaleFactors();
- double RefRotion = pBlockRef->rotation();
- mat = pBlockRef->blockTransform();
- invmat = mat.inverse();
- mat1.setToIdentity();
- mat1.setToRotation( - RefRotion,zAxis,Refposion);/*图块转回水平位置的矩阵*/
- mat2 = mat2.setToTranslation(vec);
- mat1.setToProduct(mat2,mat1);
- pBlkRefEnt->close();
- if (!mat.isUniScaledOrtho())
- {
- //不等比例图块
- Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()
- ->getBlockTable(pBlockTable, AcDb::kForWrite);
- if (es != Acad::eOk)
- {
- pBlockTable->close();
- pBlockTableRec->close();
- acedRedraw(BlkRef,4);
- return;
- }
- pUnBlockTableRec = new AcDbBlockTableRecord();
- if (Acad::eOk != pUnBlockTableRec->setName(_T("*U")))
- {
- pBlockTable->close();
- pBlockTableRec->close();
- acedRedraw(BlkRef,4);
- delete pUnBlockTableRec;
- return;
- }
- //定义无名块
- pBlockTable->add(pUnBlockTableRecId,pUnBlockTableRec);
- for (long i = 0;i < len;i++)
- {
- AcDbEntity *pEnt,*pnewEnt = NULL;
- AcDbObjectId Id;
- ads_name ent;
- acedSSName(ss,i,ent);
- acdbGetObjectId(Id,ent);
- if (acdbOpenObject(pEnt,Id,AcDb::kForWrite) != Acad::eOk)
- continue;
- pEnt->getTransformedCopy(mat1,pnewEnt);
- pUnBlockTableRec->appendAcDbEntity(pnewEnt);
- pEnt->erase(Adesk::kTrue);
- pEnt->close();
- pnewEnt->close();
- }
-
- pUnBlockTableRec->close();
- //插入无名块
- resbuf tilemode;
- acedGetVar(_T("TILEMODE"),&tilemode);
- int tile=tilemode.resval.rint;
- if (tile)
- es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
- else
- es = pBlockTable->getAt(ACDB_PAPER_SPACE, pBlockTableRecord,AcDb::kForWrite);
- if (es != Acad::eOk)
- {
- pBlockTable->close();
- pBlockTableRecord->close();
- return;
- }
- pBlockTable->close();
- AcDbBlockReference *pBlockReference;
- pBlockReference = new AcDbBlockReference();
- pBlockReference->setBlockTableRecord(pUnBlockTableRecId);
- pBlockReference->setPosition(AcGePoint3d::kOrigin);
- AcGeScale3d scale3d = Refscale3d.inverse();
- pBlockReference->setScaleFactors(scale3d);
- AcDbObjectId entId;
- pBlockTableRecord->appendAcDbEntity(entId, pBlockReference);
- pBlockTableRecord->close();
- AcDbVoidPtrArray ptrArry;
- if (pBlockReference->explode(ptrArry) != Acad::eOk)
- {
- pBlockTableRec->close();
- pBlockReference->close();
- return;
- }
- pBlockReference->erase(Adesk::kTrue);
- pBlockReference->close();
- for (int i = 0;i < ptrArry.length();i++)
- {
- AcDbEntity * pE;
- pE = (AcDbEntity *)ptrArry.at(i);
- pBlockTableRec->appendAcDbEntity(pE);
- pE->close();
- }
- pBlockTableRec->close();
- }
- else
- {
- for (long i = 0;i < len;i++)
- {
- AcDbEntity *pEnt,*pnewEnt = NULL;
- AcDbObjectId Id;
- ads_name ent;
- acedSSName(ss,i,ent);
- acdbGetObjectId(Id,ent);
- if (acdbOpenObject(pEnt,Id,AcDb::kForWrite) != Acad::eOk)
- continue;
- pEnt->getTransformedCopy(invmat,pnewEnt);
- pBlockTableRec->appendAcDbEntity(pnewEnt);
- pEnt->erase(Adesk::kTrue);
- pEnt->close();
- pnewEnt->close();
- }
- pBlockTableRec->close();
- }
- acedRedraw(BlkRef,4);
- acedCommand(RTSTR, _T("_.REGEN"), RTNONE);
- }
|
评分
-
查看全部评分
|