- UID
- 59465
- 积分
- 267
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-6-18
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2003-7-27 22:32:37
|
显示全部楼层
嗯?是吗?
也可以象你上面的图片中一样只修改隐藏属性就好了吗?如果是的话那就简单很多了。。。
修改隐藏属性不可行。。。
GripPoints会出现。。。

- [FONT=courier new]
- //取得标注线的长度
- void GetDimLen(AcDbEntity* pEnt,double &DimLen)
- {
- AcGeVector3d Vec(1,0,0);
- AcGePoint3d intrePt1,intrePt2,EPt1,EPt2,DmLPt;
- double DimRt;
- if(strcmp(pEnt->isA()->name(),"AcDbAlignedDimension")==0)
- {
- AcDbAlignedDimension *pDim;
- pDim=AcDbAlignedDimension::cast(pEnt);
-
- //取得标注线点
- DmLPt=pDim->dimLinePoint();
- //取得标注转角
- DimRt = pDim->horizontalRotation();
- Vec.rotateBy(DimRt,AcGeVector3d(0,0,1));
- Vec.normalize();
-
- //取得Ext点并加入到数据库中
- EPt1 = pDim->xLine1Point();
- EPt2 = pDim->xLine2Point();
- }
- else if(strcmp(pEnt->isA()->name(),"AcDbRotatedDimension")==0)
- {
- AcDbRotatedDimension *pDim;
- pDim = AcDbRotatedDimension::cast(pEnt);
- //取得标注线点
- DmLPt=pDim->dimLinePoint();
-
- //取得标注转角
- DimRt = pDim->horizontalRotation();
- Vec.rotateBy(DimRt,AcGeVector3d(0,0,1));
- Vec.normalize();
-
- //取得Ext点并加入到数据库中
- EPt1 = pDim->xLine1Point();
- EPt2 = pDim->xLine2Point();
- }
- //取得经过DimPt点的直线和经过Ext点垂直于该直线的平面
- AcGeLine3d DimL(DmLPt,Vec);
- AcGePlane PlaneE1(EPt1,Vec);
- AcGePlane PlaneE2(EPt2,Vec);
- //求出2交点间的距离(Dim线长度)
- DimL.intersectWith(PlaneE1,intrePt1);
- DimL.intersectWith(PlaneE2,intrePt2);
-
- DimLen = intrePt1.distanceTo(intrePt2);
- }
- //尺寸变文字
- void DimToText()
- {
- ads_name ssDim,EntityName;
- AcDbEntity *pEnt = NULL;
- struct resbuf pRb;
- AcDbObjectId retId,objId,TxtStyId,DmStyId,LayTxtId;
- AcGePoint3d DmLPt,TxtPt,EPt1,EPt2,TmpPt;
- double TxtH,TxtRt,DimLen;
- AcDbDimStyleTableRecord *pDmTblRcd;
- Acad::ErrorStatus es;
-
- //获取选择集过滤List(由实体名称过滤)
- char sbuf[50]; // Buffers to hold strings
- pRb.restype = 0; //实体名称
- strcpy(sbuf, "Dimension");
- strupr(sbuf);
- pRb.resval.rstring = sbuf;
- pRb.rbnext = NULL;
- //打开块表记录
- AcDbBlockTable *pBlockTable;
- acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
- AcDbBlockTableRecord *pSpace;
- pBlockTable->getAt(ACDB_MODEL_SPACE,pSpace,AcDb::kForWrite);
- //选取尺寸标注并对选择集中的实体进行过滤
- ads_printf("\n请选择要变文字的标注");
- int ss= ads_ssget(NULL,NULL,NULL,&pRb,ssDim);
- //取得选择集中实体个数
- long NumOfEntity;
- ss = ads_sslength(ssDim,&NumOfEntity);
- //创建文字层
- gCyz_ArxBegin();
- LayTxtId = gConfig.GetLayerId(LWENZI);
- gCyz_ArxEnd();
- //遍历实体
- for(long i = 0 ; i<NumOfEntity; i++)
- {
- AcDbDimension *pDim = NULL;
- AcGeVector3d Vec;
-
- ads_ssname(ssDim,i,EntityName);
-
- acdbGetObjectId(objId,EntityName);
-
- if(acdbOpenObject(pEnt,objId,AcDb::kForWrite)!=Acad::eOk)
- {
- ads_printf("\n打开实体时出错!");
- return;
- }
- pDim = AcDbDimension::cast(pEnt);
- //取得标注样式风格
- DmStyId = pDim->dimensionStyle();
- //取得文字内容
- char *Txt = pDim->dimensionText();
-
- if(strcmp(Txt,"")==0)
- {
- CString str;
- GetDimLen(pEnt,DimLen);
- int Dim = (int)DimLen;
- if((DimLen - (double)Dim) >= 0.5) Dim += 1;
- str.Format("%d",Dim);
- Txt = (LPSTR)(LPCSTR)str;
- }
-
-
- //取得文字中心点和偏角
- TxtPt = pDim->textPosition();
- TxtRt = pDim->textRotation();
-
- //删除标注——删除一定要在打开标注记录表之前完成!!!!!!!
- es = pDim->erase();
- es = pEnt->close();
- //打开标注记录表
- acdbOpenObject(pDmTblRcd,DmStyId,AcDb::kForWrite);
-
- //取得文字风格
- TxtStyId = pDmTblRcd->dimtxsty();
- //取得文字高度
- TxtH = pDmTblRcd->dimtxt();
-
- //创建新的文字
- AcDbMText *pMTxt = new AcDbMText;
- pMTxt->setTextStyle(TxtStyId);
- pMTxt->setContents(Txt);
- pMTxt->setLocation(TxtPt);
- pMTxt->setTextHeight(TxtH);
- pMTxt->setAttachment(AcDbMText::kMiddleCenter);
- pMTxt->setRotation(TxtRt);
- pMTxt->setNormal(AcGeVector3d(0,0,1));
-
- pSpace->appendAcDbEntity(retId,pMTxt);
- pMTxt->setLayer(LayTxtId);
- pDmTblRcd->close();
- pMTxt->close();
- }
-
- pBlockTable->close();
- pSpace->close();
- }
- 以上代码已经经过修正,功能实现。
- 从里面吸取的经验是:删除一定要在标注记录表打开之前或者其关闭之后进行~~~否则删除不掉。。。
- [/FONT]
|
|