乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 209|回复: 12

外部参照附着或覆盖

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-3-16 01:51:55 | 显示全部楼层 |阅读模式
我用的是某个CallMeDave的vbassoc函数,我有Frank的Vlax类。因为我不知道lisp,所以后者有点难用。我现在正在处理一个xref类或函数,想知道xref是附加的还是叠加的。到目前为止,dxf代码70似乎是我需要的块,但我不知道如何去做。使用SCMD的函数我得到一个nil。我假设答案是一个列表,并且只需要正确处理。有什么想法吗?
这是vbassoc
  1. 'SomeCallMeDave
  2. 'http://www.vbdesign.net/expresso/showthread.php?postid=83887#post83887
  3. 'Changed pAcadObj As AcadObject to pAcadObj As Object to access imagedef as well
  4. Public Function vbAssoc(pAcadObj, pDXFCode As Integer) As Variant
  5. Dim VLisp As Object
  6. Dim VLispFunc As Object
  7. Dim varRetVal As Variant
  8. Dim obj1 As Object
  9. Dim obj2 As Object
  10. Dim strHnd As String
  11. Dim strVer As String
  12. Dim lngCount As Long
  13. Dim i As Long
  14. Dim j As Long
  15. On Error GoTo vbAssocError
  16. strHnd = pAcadObj.handle
  17. If Left(ThisDrawing.Application.Version, 2) = "16" Then
  18.   Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")
  19. Else
  20.   Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")
  21. End If
  22. Set VLispFunc = VLisp.ActiveDocument.Functions
  23. Set obj1 = VLispFunc.item("read").funcall("pDXF")
  24.   varRetVal = VLispFunc.item("set").funcall(obj1, pDXFCode)
  25. Set obj1 = VLispFunc.item("read").funcall("pHandle")
  26.   varRetVal = VLispFunc.item("set").funcall(obj1, strHnd)
  27. Set obj1 = VLispFunc.item("read").funcall("(vl-princ-to-string (cdr (assoc pDXF (entget (handent pHandle)))))")
  28.   varRetVal = VLispFunc.item("eval").funcall(obj1)
  29.   
  30. vbAssoc = varRetVal
  31. 'clean up the newly created LISP symbols
  32. Set obj1 = VLispFunc.item("read").funcall("(setq pDXF nil)")
  33.   varRetVal = VLispFunc.item("eval").funcall(obj1)
  34. Set obj1 = VLispFunc.item("read").funcall("(setq pHandle nil)")
  35.   varRetVal = VLispFunc.item("eval").funcall(obj1)
  36.   
  37. 'release the objects or Autocad gets squirrely (no offense RR)
  38. Set obj2 = Nothing
  39. Set obj1 = Nothing
  40. Set VLispFunc = Nothing
  41. Set VLisp = Nothing
  42. Exit Function
  43. vbAssocError:
  44.   Set obj2 = Nothing
  45.   Set obj1 = Nothing
  46.   Set VLispFunc = Nothing
  47.   Set VLisp = Nothing
  48.   MsgBox "Error occurred " & Err.Description
  49. End Function

Debug.Print"lisp",vbAssoc(oBlock,2),vbAssoc(oBlock,70)

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2006-3-16 14:10:09 | 显示全部楼层
Bryco,
问题在于在 BlocksCollection 中为 Block 返回的句柄与 lisp 中从 Block 表返回的句柄不同。
我认为这是由于一个引用了块表,另一个引用了Block_Record表........Block_Record没有组 70 代码,而 Block 有。
我现在正在寻找是否有一个简单的方法来解决这个问题....
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-3-16 14:24:54 | 显示全部楼层
哎哟棘手的地面。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2006-3-16 14:51:26 | 显示全部楼层
好吧,这对我来说很有用:
  1. 'SomeCallMeDave
  2. 'http://www.vbdesign.net/expresso/showthread.php?postid=83887#post83887
  3. 'Changed pAcadObj As AcadObject to pAcadObj As Object to access imagedef as well
  4. 'Modified by Jeff Mishler, March 2006, to get the Block table object, not Block_Record table object
  5. Public Function vbAssoc(pAcadObj, pDXFCode As Integer) As Variant
  6. Dim VLisp As Object
  7. Dim VLispFunc As Object
  8. Dim varRetVal As Variant
  9. Dim obj1 As Object
  10. Dim obj2 As Object
  11. Dim strHnd As String
  12. Dim strVer As String
  13. Dim lngCount As Long
  14. Dim i As Long
  15. Dim j As Long
  16. On Error GoTo vbAssocError
  17.    
  18. If Left(ThisDrawing.Application.Version, 2) = "16" Then
  19.   Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")
  20. Else
  21.   Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")
  22. End If
  23. Set VLispFunc = VLisp.ActiveDocument.Functions
  24. If Not TypeOf pAcadObj Is AcadBlock Then
  25.     strHnd = pAcadObj.Handle
  26. Else
  27.     Dim lispStr As String
  28.     lispStr = "(cdr (assoc 5 (entget (tblobjname " & Chr(34) & "Block" & Chr(34) & Chr(34) & pAcadObj.Name & Chr(34) & "))))"
  29.     Set obj1 = VLispFunc.Item("read").funcall(lispStr)
  30.     strHnd = VLispFunc.Item("eval").funcall(obj1)
  31. End If
  32. Set obj1 = VLispFunc.Item("read").funcall("pDXF")
  33.   varRetVal = VLispFunc.Item("set").funcall(obj1, pDXFCode)
  34. Set obj1 = VLispFunc.Item("read").funcall("pHandle")
  35.   varRetVal = VLispFunc.Item("set").funcall(obj1, strHnd)
  36. Set obj1 = VLispFunc.Item("read").funcall("(vl-princ-to-string (cdr (assoc pDXF (entget (handent pHandle)))))")
  37.   varRetVal = VLispFunc.Item("eval").funcall(obj1)
  38. vbAssoc = varRetVal
  39. 'clean up the newly created LISP symbols
  40. Set obj1 = VLispFunc.Item("read").funcall("(setq pDXF nil)")
  41.   varRetVal = VLispFunc.Item("eval").funcall(obj1)
  42. Set obj1 = VLispFunc.Item("read").funcall("(setq pHandle nil)")
  43.   varRetVal = VLispFunc.Item("eval").funcall(obj1)
  44. 'release the objects or Autocad gets squirrely (no offense RR)
  45. Set obj2 = Nothing
  46. Set obj1 = Nothing
  47. Set VLispFunc = Nothing
  48. Set VLisp = Nothing
  49. Exit Function
  50. vbAssocError:
  51.   Set obj2 = Nothing
  52.   Set obj1 = Nothing
  53.   Set VLispFunc = Nothing
  54.   Set VLisp = Nothing
  55.   MsgBox "Error occurred " & Err.Description
  56. End Function

回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-3-16 16:21:02 | 显示全部楼层
杰夫你确实有渊博的知识。如果你知道关于100美元账单的老笑话,这里有99粒花生,告诉你从哪里下手。
嘿,什么是沼泽花生?
谢谢你,伙计。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2006-3-16 16:39:15 | 显示全部楼层

别客气!即使我以前遇到过这种情况,从而让我知道问题是什么,我直到现在才寻求解决方案.....令我惊喜的是,这是一个相对简单的修复程序。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2006-3-16 17:17:59 | 显示全部楼层
根据 MP 在 lisp 论坛上的帖子,这只有在检查当前图形中外部参照的状态时才有效。如果你想在远程/ObjectDBX绘图上使用它,它需要像MP所做的那样重写。
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2006-3-16 18:21:03 | 显示全部楼层
好吧,把这个:
  1. If Not TypeOf pAcadObj Is AcadBlock Then
  2.     strHnd = pAcadObj.Handle
  3. Else
  4.     Dim lispStr As String
  5.     lispStr = "(cdr (assoc 5 (entget (tblobjname " & Chr(34) & "Block" & Chr(34) & Chr(34) & pAcadObj.Name & Chr(34) & "))))"
  6.     Set obj1 = VLispFunc.Item("read").funcall(lispStr)
  7.     strHnd = VLispFunc.Item("eval").funcall(obj1)
  8. End If

换成这个:
  1.     strHnd = pAcadObj.Handle
  2. If TypeOf pAcadObj Is AcadBlock Then
  3.     strHnd = Hex(1 + Val("&H" & strHnd))
  4. End If

,这似乎有效,但我似乎记得T.T.说这种方法不能总是被依赖。
*Jeff_M去研究更多......
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-3-19 11:43:07 | 显示全部楼层
我尝试在vba中查找块表,但没有结果
使用十六进制(1+Val(“&H”&strHnd))给出了以下消息:
“出现错误参数类型:lentinype nil”和崩溃
这是一个137文件(88 mb)的dwg。有人给我玩的。没有覆盖层,所有连接和嵌套在阴阳上。由于某些原因,即使它们都在同一个文件夹中,它们也不会改变路径,所以我也在做(如果是这个词的话)一个重设子对象。似乎路径只能在外部参照的直接宿主中更改,所以现在它变得很耗时。Getsubentity将为您提供所有者,但这不是一个好方法。块的所有者始终是AcDbBlockTable,因此使用ownerid是不可行的。这样,就可以在每个块中循环查找是否为外部参照,并将所有内容放入嵌套深度的有序组中
更改父dwg上的路径。然后打开孩子的画,改变他们的路径等等,缓慢而痛苦
(我宁愿派几个用钳子和喷灯打硬管的家伙来用“低俗小说”的方式来创作dwg。)
想知道我是否错过了简单的方法?
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-3-19 22:05:49 | 显示全部楼层
谢谢Glenn。我要花一段时间才能明白这一点。0和1的block.counts(1是文本-xref)可能会有所帮助。
我还没有找到可靠的方法来计算xref是否已加载并且符合犹太标准。我认为block.path没有/就足够了,但出于某种原因,我有一个没有完整路径的xref,并且计数大于1,这就像dwg中的larry一样快乐。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-6 06:38 , Processed in 1.167525 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表