|
www.mxdraw.com
|
表示AutoCAD中所有标注实体类型的类的基类型
[ object, uuid(8A9CBCF3-EC92-438B-8AD7-9266865BC6BA), dual, nonextensible, helpstring("IMxDrawDimension interface"), pointer_default(unique) ]
interface IMxDrawDimension : IMxDrawEntity;MxDrawDimension.idl
例如: 修一个标注长度,标注的直线也跟着变化,C#例子
用来选择实体对象.
MxDrawUiPrEntity getEntity = new MxDrawUiPrEntity();
getEntity.message = "选择实体";
// 设置选择过滤条件.
MxDrawResbuf selFilter = new MxDrawResbuf();
// 5020是实体类型的DXF组码. DIM是类型。
selFilter.AddStringEx("ALIGNEDDIMENSION",5020);
getEntity.setFilter(selFilter);
// 开始选择实体。
if(getEntity.go() != MCAD_McUiPrStatus.mcOk)
return;
// 得到选择的实体.
MxDrawEntity ent = getEntity.Entity();
if (ent == null)
return;
if (!(ent is MxDrawDimAligned) )
{
return;
}
// 得到选择的标注.
MxDrawDimAligned dimAligned = (MxDrawDimAligned)ent;
// 尺寸标注改成60
double dNewDist = 60.0;
// 当前标注的两个点坐标。
MxDrawPoint pt1 = dimAligned.XLine1Point;
MxDrawPoint pt2 = dimAligned.XLine2Point;
// 计算pt1到pt2的向量.
MxDrawVector3d vec = pt2.SumVector(pt1);
// 把向量单位化
vec.Normalize();
//把向长度变成新距离.
vec.Mult(dNewDist);
// 算出在新距离下的新的坐标点。
MxDrawPoint newPt = new MxDrawPoint();
newPt.x = pt1.x;
newPt.y = pt1.y;
newPt.Add(vec);
// 修改尺寸标注.
dimAligned.XLine2Point = newPt;
dimAligned.RecomputeDimBlock(true);
// 查找尺寸标的直线段。并修改它。
MxDrawResbuf filter = new MxDrawResbuf();
filter.AddStringEx("LINE",5020);
MxDrawSelectionSet ss = new MxDrawSelectionSet();
// 得到标注的开始点上的实体.
// 搜索精度。
double dTol = 10;//axMxDrawX1.ViewLongToDocCoord(3);
MxDrawPoint selPt1 = new MxDrawPoint();
MxDrawPoint selPt2 = new MxDrawPoint();
selPt1.x = pt1.x - dTol;
selPt1.y = pt1.y - dTol;
selPt2.x = pt1.x + dTol;
selPt2.y = pt1.y + dTol;
ss.Select(MCAD_McSelect.mcSelectionSetCrossing, selPt1, selPt2, filter);
// 可能会得到多个实体,遍历所有实体,找到标注的直线对象。
for(int i = 0; i < ss.Count;i++)
{
MxDrawEntity findEnt = ss.Item(i);
if (!(findEnt is MxDrawLine))
{
continue;
}
MxDrawLine line = (MxDrawLine)findEnt;
// 得到直线的两个点坐标。
MxDrawPoint sPt = line.StartPoint;
MxDrawPoint ePt = line.EndPoint;
double dDis1 = sPt.DistanceTo(pt1);
double dDis2 = ePt.DistanceTo(pt1);
if(dDis1 > dDis2)
{
if (dDis2 > dTol)
continue;
if(sPt.DistanceTo(pt2) > dTol)
continue;
// 直线的开始点,在pt2附近
line.StartPoint = newPt;
break;
}
else
{
if(dDis1 > dTol)
continue;
if(ePt.DistanceTo(pt2) > dTol)
continue;
// 直线的结束点,在pt2附近
line.EndPoint = newPt;
break;
}
}
axMxDrawX1.ZoomAll();例如: 得到图上所有标注的标注文本
// 定义一个构造选择集对象。 MxDrawSelectionSet ss = new MxDrawSelectionSet(); // 选择图上所有对象. ss.AllSelect(); for(int i = 0; i < ss.Count;i++) { // 遍历到一个对象。 MxDrawEntity ent = (MxDrawEntity) ss.Item(i); if (ent is MxDrawDimension) { // 如果是一个标注对象. MxDrawDimension dim = (MxDrawDimension)ent; // 得到标注对象文本. String sTxt = dim.DimensionText; if(sTxt.Length == 0) { // 如果文本为空,表示,标注文字是自动生成的 // 打碎标注对象,得到里面的文字对象. MxDrawResbuf ret = dim.GetProp("ExplodeEx"); for(int j = 0; j < ret.Count;j++) { MxDrawMcDbObject obj = ret.AtObject(i); if(obj == null) continue; if(obj is MxDrawMText) { // 该对象是个多行文本 // 取到文字对象,得到文字符串. MxDrawMText txt = (MxDrawMText)obj; sTxt = txt.Contents; break; } else if(obj is MxDrawText) { // 该对象是个单行文本 MxDrawText txt = (MxDrawText)obj; sTxt = txt.TextString; break; } } } // 显示得到文字内容 MessageBox.Show(sTxt); // 显示对象的线型 MessageBox.Show(ent.LineType); } }