jsyang_ren 发表于 2005-6-28 17:27:00

[讨论]非常奇怪的现象,付源码

程序为把标注中的<>变为实际数值


但是我在一些图中测试成功,但在一些复杂的图形中的标注无法完全把       标注中的<>变为实际数值


望高手指点,在线等~~~~~~~~~~~



Public keyWord As String<BR>                       Public m As Integer<BR>                       Public n As Integer<BR>Public Sub SelfOverRide(objDim As AcadSelectionSet)<BR>       Dim objBlk As AcadBlock<BR>       Dim objEnt As AcadEntity<BR>       Dim objEnt2 As AcadEntity<BR>       Dim varPos As Variant<BR>       Dim varInsPnt As Variant<BR>       Dim objDimText As AcadMText<BR>       Dim objBlocks As AcadBlocks<BR>       Dim blnDone As Boolean<BR>       'On Error Resume Next<BR>       Set objBlocks = ThisDrawing.Blocks<BR>       'varPos = objDim.TextPosition<BR>       'For Each objBlk In objBlocks<BR>               ' If Not blnDone Then<BR>               m = 0<BR>               n = 0<BR>                               For Each objEnt2 In objDim<BR>                                                               If TypeOf objEnt2 Is AcadDimension Then<BR>                                                                                       varPos = objEnt2.TextPosition<BR>                                                                                       m = m + 1<BR>                                                                                       For Each objBlk In objBlocks<BR>                                                                                                                                                       If Left(objBlk.Name, 2) = "*D" Then<BR>                                                                                                                                                                       For Each objEnt In objBlk<BR>                                                                                                                                                                                       If TypeOf objEnt Is AcadMText Then<BR>                                                                                                                                                                                                       Set objDimText = objEnt<BR>                                                                                                                                                                                                       varInsPnt = objDimText.InsertionPoint<BR>                                                                                                                                                                                                       If varInsPnt(0) = varPos(0) Then<BR>                                                                                                                                                                                                                       If varInsPnt(1) = varPos(1) Then<BR>                                                                                                                                                                                                                                                               If keyWord = "T" Then<BR>                                                                                                                                                                                                                                                                                       objEnt2.TextOverride = objDimText.TextString<BR>                                                                                                                                                                                                                                                                       Else<BR>                                                                                                                                                                                                                                                                                       objEnt2.TextOverride = "&lt;&gt;"<BR>                                                                                                                                                                                                                                                                       End If<BR>                                                                                                                                                                                                                                                                       n = n + 1<BR>                                                                                                                                                                                                                                       Exit For<BR>                                                                                                                                                                                                                       End If<BR>                                                                                                                                                                                                       End If<BR>                                                                                                                                                                                       End If<BR>                                                                                                                                                                       Next objEnt<BR>                                                                                                                                                       End If<BR>                                                                                       Next objBlk<BR>                                                                       End If<BR>                               Next objEnt2<BR>                       'Else<BR>                       '       Exit For<BR>               ' End If


End Sub


Sub DIMtext()<BR>                       Dim strPrmt As String<BR>                       Dim objEnt As AcadEntity<BR>                       Dim varPnt As Variant<BR>                       Dim IsDimension As Boolean<BR>                       Dim objDim As AcadDimension<BR>                       Dim SS As AcadSelectionSet


                       On Error Resume Next<BR>                       strPrmt = vbCr &amp; "选择标注对象:"<BR>                       ThisDrawing.Utility.InitializeUserInput 1, "T A"<BR>                       keyWord = ThisDrawing.Utility.GetKeyword _<BR>                                                                                                       ("选择标注形式 (文字(T)/自动(A)): ")<BR>                       ThisDrawing.Utility.Prompt strPrmt<BR>                       ThisDrawing.SelectionSets.Item("SS1").Delete<BR>                       Set SS = ThisDrawing.SelectionSets.Add("SS1")<BR>                       SS.SelectOnScreen<BR>                       <BR>                       <BR>                       SelfOverRide SS<BR>                       ThisDrawing.Utility.Prompt "共选择尺寸标注" &amp; m &amp; "个," &amp; "转换成功" &amp; n &amp; "个."<BR>                       Exit Sub


End Sub


雪山飞狐_lzh 发表于 2005-6-28 21:21:00

有这样的例图么?贴一个上来看看?

jsyang_ren 发表于 2005-6-29 08:31:00

图形是CAD图


随便找一张复杂点的图都会出现这个问题 不能把所有标注转换为真实值 仍然显示<>


斑竹指教啊

jsyang_ren 发表于 2005-6-29 10:11:00

我发现主要问题是出在标注文字的插入点和CAD摸板空间中对应的MTEXT文字块插入点不一样如何解决???


varPos = objEnt2.TextPosition


不等于


                                                                                                                                                                                               varInsPnt = objDimText.InsertionPoint<BR>                                                                                                                                                                                                       If varInsPnt(0) = varPos(0) Then<BR>                                                                                                                                                                                                                       If varInsPnt(1) = varPos(1) Then<BR>

jsyang_ren 发表于 2005-6-29 10:20:00

我想到了另一种方法,但是我不知道怎么找到尺寸文字标注的块名,例如LISP里可以看到标注的文字块名 *D 在VBA中如何找啊????

雪山飞狐_lzh 发表于 2005-6-29 10:21:00

可以试试Vlax类调用lisp代码实现,另外,源代码共享版有明总的方法,可以看看

jsyang_ren 发表于 2005-6-29 11:18:00

我看到了,明总的方法和我的一样,也存在这个问题


我已经知道原因了,归纳了一下.


CAD中的标注文字以块的形式存在于图中,为隐藏块.至于标注中的值就存在这些块里,例如*D46等等,如果是自动标注,块里的文字仍然是真实值.每一个标注对应一个隐藏块,由于用户可能要拖动尺寸的控制点,所以CAD并没有把标注中的文字与块中文字插入点等同起来.而是用块名去查找.


但是如果图中用到了外部引用块或是编辑过标注的属性,块中的文字插入点就和标注中文字插入点不一样,这时唯一的方法只能刷新图面,让图面重新计算坐标.单靠REDRAW是不行的,必须让CAD重绘.一切问题就可解决

jsyang_ren 发表于 2005-6-29 11:20:00

如果哪为DX有新的见解,请多指教
页: [1]
查看完整版本: [讨论]非常奇怪的现象,付源码