乐筑天下

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

[编程交流] vl catch all适用于lambda

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:18:24 | 显示全部楼层 |阅读模式
大家好,
我正在学习“错误捕捉”,但出现了一些问题。
我想我已经理解了它的基本原理(通过这个示例代码和注释):
  1. (defun C:test ( / SS a errCount o ll ur )
  2. (if (not (setq SS (ssget "_I")))
  3.         (progn
  4.                 (prompt "\nSelect objects to rotate: ")
  5.                 (setq SS (ssget "_:L"))
  6.         )
  7. )
  8. (if SS
  9.         (progn
  10.                 (sssetfirst nil nil)
  11.                 (initget 1)
  12.                 (setq a (getangle "\nSpecify rotation angle: "))
  13.                 (setq errCount 0)
  14.                 (vlax-for o (setq SS (vla-get-ActiveSelectionSet (vla-get-activedocument (vlax-get-acad-object))))
  15.                         (vla-GetBoundingBox o 'll 'ur)
  16.                         (if
  17.                                 (vl-catch-all-error-p ; determines if the value of (vl-catch-all-apply) is an error, returns T or nil
  18.                                         (vl-catch-all-apply ; requires a (function) and a (list)
  19.                                                 'vla-rotate ; the function (can be a lambda expression either)
  20.                                                 (list ; the list
  21.                                                         o ; <- arg (vla-object)
  22.                                                         (vlax-3D-point ; <- arg (safearray point)
  23.                                                                 (mapcar '(lambda (a b) (/ (+ a b) 2.))
  24.                                                                         (vlax-safearray->list ll)
  25.                                                                         (vlax-safearray->list ur)
  26.                                                                 )
  27.                                                         )
  28.                                                         a ; <- arg (angle)
  29.                                                 ); list
  30.                                         )
  31.                                 )
  32.                                 (setq errCount (1+ errCount))
  33.                         ); if
  34.                 ); vlax-for
  35.                 (if (/= 0 errCount) (princ (strcat "\n" (itoa errCount) " objects were on locked layer!")))
  36.                 (vla-delete SS)
  37.         );progn
  38. ); if SS
  39. (princ)
  40. ); defun
  41. (vl-load-com)(princ)

 
然后,为了知道该错误消息是什么,只需将函数vl-catch-all-error-p替换为该vl-catch-all错误消息
 
希望这有帮助。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:37:34 | 显示全部楼层
 
因此,使用vla StartUndoMark函数,您可以设置一个标记,用于撤消在该函数和必要的后续函数之间运行的一系列操作,即vla EndUndoMark,以结束或标记您在程序中执行的一系列操作的结束,然后,当你需要撤销你已经做过的事情时,你可以撤销之前在这两个函数之间包含的所有任务。
 
运行Test1,当您完成时,尝试撤消并对第二个程序Test2执行相同的操作,以通过使用上述函数查看两者之间的差异。
  1. [color=#8b4513]; the main task: trying to use [b][color=BLACK]([/color][/b]vl-catch-all-apply[b][color=BLACK])[/color][/b] with [b][color=BLACK]([/color][/b]lambda[b][color=BLACK])[/color][/b][/color]
  2. [color=#8b4513]; the goal here is to iterate trough all layers, and return the non-active ones [b][color=BLACK]([/color][/b]couldn't figure out a better example[b][color=BLACK])[/color][/b][/color]
  3. [b][color=BLACK]([/color][/b]defun C:test [b][color=FUCHSIA]([/color][/b] / LayersLst [b][color=FUCHSIA])[/color][/b]
  4. [b][color=FUCHSIA]([/color][/b]vl-load-com[b][color=FUCHSIA])[/color][/b]
  5. [color=#8b4513]; any explanation when/why [color=#2f4f4f]"Start/End UndoMark"[/color] method is used for?[/color]
  6. [b][color=FUCHSIA]([/color][/b]vla-StartUndoMark [b][color=NAVY]([/color][/b]vla-get-ActiveDocument [b][color=MAROON]([/color][/b]vlax-get-acad-object[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  7. [b][color=FUCHSIA]([/color][/b]vlax-for lay [b][color=NAVY]([/color][/b]vla-get-Layers [b][color=MAROON]([/color][/b]vla-get-ActiveDocument [b][color=GREEN]([/color][/b]vlax-get-acad-object[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  8.         [b][color=NAVY]([/color][/b]setq LayersLst [b][color=MAROON]([/color][/b]cons lay LayersLst[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  9. [b][color=FUCHSIA])[/color][/b][color=#8b4513]; vlax-for[/color]
  10. [color=#8b4513]; The main question is below:[/color]
  11. [b][color=FUCHSIA]([/color][/b]if
  12.         [b][color=NAVY]([/color][/b]vl-catch-all-error-p
  13.                 [b][color=MAROON]([/color][/b]vl-catch-all-apply [color=#8b4513]; will [b][color=GREEN]([/color][/b]vl-catch-all-apply[b][color=GREEN])[/color][/b] + [b][color=GREEN]([/color][/b]lambda[b][color=GREEN])[/color][/b] work for more than one list?[/color]
  14.                         '[b][color=GREEN]([/color][/b]lambda [b][color=BLUE]([/color][/b] x [b][color=BLUE])[/color][/b] [color=#8b4513]; arguments?![/color]
  15.                                 [b][color=BLUE]([/color][/b]eq
  16.                                         [b][color=RED]([/color][/b]car x[b][color=RED])[/color][/b]
  17.                                         [b][color=RED]([/color][/b]cadr x[b][color=RED])[/color][/b]
  18.                                 [b][color=BLUE])[/color][/b][color=#8b4513]; test for the error [b][color=BLUE]([/color][/b]must be like this?[b][color=BLUE])[/color][/b][/color]
  19.                         [b][color=GREEN])[/color][/b]
  20.                         [b][color=GREEN]([/color][/b]list [color=#8b4513]; wrap 2 lists in one?[/color]
  21.                                 [b][color=BLUE]([/color][/b]mapcar 'vla-get-name LayersLst[b][color=BLUE])[/color][/b]
  22.                                 [b][color=BLUE]([/color][/b]list [b][color=RED]([/color][/b]vla-get-name [b][color=PURPLE]([/color][/b]vla-get-ActiveLayer [b][color=TEAL]([/color][/b]vla-get-ActiveDocument [b][color=OLIVE]([/color][/b]vlax-get-acad-object[b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  23.                         [b][color=GREEN])[/color][/b]
  24.                 [b][color=MAROON])[/color][/b]
  25.         [b][color=NAVY])[/color][/b]
  26.         [b][color=NAVY]([/color][/b]princ [b][color=MAROON]([/color][/b]strcat [color=#2f4f4f]"\nNot Active: "[/color] [b][color=GREEN]([/color][/b]vla-get-name [b][color=BLUE]([/color][/b]car x[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  27.         [b][color=NAVY]([/color][/b]princ [b][color=MAROON]([/color][/b]strcat [color=#2f4f4f]"\nActive Layer: "[/color] [b][color=GREEN]([/color][/b]vla-get-name [b][color=BLUE]([/color][/b]car x[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  28. [b][color=FUCHSIA])[/color][/b][color=#8b4513]; if[/color]
  29. [b][color=FUCHSIA]([/color][/b]vla-EndUndoMark [b][color=NAVY]([/color][/b]vla-get-ActiveDocument [b][color=MAROON]([/color][/b]vlax-get-acad-object[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  30. [b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b]
  31. [b][color=BLACK])[/color][/b][color=#8b4513]; defun[/color]
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:43:22 | 显示全部楼层
谢谢你的帮助Tharwat!
在测试错误捕捉时,我取得了一点进展:
  1. ([color="blue"]vl-catch-all-error-p[/color] ([color="blue"]vl-catch-all-apply[/color]
  2.                        '([color="blue"]lambda nil[/color]
  3.                          [color="slategray"] ;; Forced to have an error in this case since it's not possible
  4.                           ;; to concatenate a string with a list of strings in this example.[/color]
  5.                           ([color="blue"]strcat[/color] [color="magenta"]"Layer1" [/color]([color="blue"]mapcar [/color]'[color="blue"]vla-get-name[/color] layerslst))
  6.                           )
  7.                        )
  8. )

它似乎可以评估函数的结果,在上面的代码中,我测试了2个defun,并将结果写在每个defun的右侧。
这意味着如果指定了属性值,则返回T进行计算。
我将继续这些实验,因为我觉得我还没有找到一个好的实际例子。(通常我看到人们通过集合对象在迭代中使用它)。
 
另一方面,对于额外的问题,您的示例确实帮助我理解了Start/End UndoMark的作用,因此我为自己编写了另一个测试代码:
  1. (defun c:Test1  (/ doc ins)
  2. (if (zerop (getvar 'pdmode))
  3.    (setvar 'pdmode 3)
  4.    )
  5. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  6. (repeat 3
  7.    (if (setq ins (getpoint "\nSpecify a point :"))
  8.      (progn
  9.        (vla-startundomark doc)
  10.        (entmake (list '(0 . "POINT") (cons 10 ins)))
  11.        (vla-endundomark doc)
  12.        )
  13.      )
  14.    )
  15. (princ)
  16. )
  17. ;;                        ;;
  18. (defun c:Test2  (/ doc ins)
  19. (if (zerop (getvar 'pdmode))
  20.    (setvar 'pdmode 3)
  21.    )
  22. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  23. (vla-startundomark doc)
  24. (repeat 3
  25.    (if (setq ins (getpoint "\nSpecify a point :"))
  26.      (entmake (list '(0 . "POINT") (cons 10 ins)))
  27.      )
  28.    )
  29. (vla-endundomark doc)
  30. (princ)
  31. )

很抱歉我的回复太晚了,我没有太多的空闲时间回复(但足以分析代码)。
如果我有什么发现,我会稍后发布,再次感谢!
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:54:37 | 显示全部楼层
你好
 
vla put LayerOn和vla put lock这两个函数始终返回nil,因此您的vl catch****示例在这种情况下确实有帮助。
 
以下代码也不会计算/到达第二行,因此变量“AcDocForB”始终为零
 
  1. ; if the active layer can be turned off, then lock it:
  2. (defun C:test1 ( / ) ; Locked and turned off
  3. (if
  4.         (not
  5.                 (vl-catch-all-error-p ; if theres an error this returns T
  6.                         (vl-catch-all-apply
  7.                                 '(lambda ()
  8.                                         (vla-put-LayerOn (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))) :vlax-false)
  9.                                 )
  10.                         )
  11.                 )
  12.         )
  13.         (vla-put-lock (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))) :vlax-true)
  14. )
  15. (princ)
  16. ); defun
  17. (defun C:test2 ( / ) ; only turned off (NOT LOCKED!)
  18. (if
  19.         (vla-put-LayerOn (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))) :vlax-false)
  20.         (vla-put-lock (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))) :vlax-true)
  21. )
  22. (princ)
  23. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:13:41 | 显示全部楼层
你好,塔瓦
谢谢,现在我知道我错了。。。我只是想问你,你是这样在控制台中检查它们的吗
  1. [color=#8b4513]; Start-End-UndoMark Testing:[/color]
  2. [color=#8b4513]; pick a series of entities, to draw for each one its boundingbox[/color]
  3. [color=#8b4513]; upon undoing [b][color=BLACK]([/color][/b]ctrl+Z[b][color=BLACK])[/color][/b], the Mark type [color=#2f4f4f]"A"[/color] should undo all the created BoundingBoxes[/color]
  4. [color=#8b4513]; upon undoing [b][color=BLACK]([/color][/b]ctrl+Z[b][color=BLACK])[/color][/b], the Mark type [color=#2f4f4f]"B"[/color] should undo one by one, every created BoundingBox[/color]
  5. [b][color=BLACK]([/color][/b]defun C:test [b][color=FUCHSIA]([/color][/b] / AcDocForA AcDocForB ent vla-obj ll ur p1 p2 p3 p4 [b][color=FUCHSIA])[/color][/b]
  6. [b][color=FUCHSIA]([/color][/b]vl-load-com[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setvar 'errno 0[b][color=FUCHSIA])[/color][/b]
  7. [b][color=FUCHSIA]([/color][/b]or
  8.         [b][color=NAVY]([/color][/b]setq AcDocForA [b][color=MAROON]([/color][/b]vla-get-ActiveDocument [b][color=GREEN]([/color][/b]vlax-get-acad-object[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [color=#8b4513]; put semicolon here[/color]
  9.         [b][color=NAVY]([/color][/b]setq AcDocForB [b][color=MAROON]([/color][/b]vla-get-ActiveDocument [b][color=GREEN]([/color][/b]vlax-get-acad-object[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [color=#8b4513]; or put semicolon here[/color]
  10. [b][color=FUCHSIA])[/color][/b]
  11. [b][color=FUCHSIA]([/color][/b]if AcDocForA [b][color=NAVY]([/color][/b]vla-StartUndoMark AcDocForA[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; Mark type: [color=#2f4f4f]"A"[/color][/color]
  12. [b][color=FUCHSIA]([/color][/b]while T
  13.         [b][color=NAVY]([/color][/b]while
  14.                 [b][color=MAROON]([/color][/b]not
  15.                         [b][color=GREEN]([/color][/b]and
  16.                                 [b][color=BLUE]([/color][/b]setq ent [b][color=RED]([/color][/b]car [b][color=PURPLE]([/color][/b]entsel [color=#2f4f4f]"\Pick an entity to draw its BBox: "[/color][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  17.                                 [b][color=BLUE]([/color][/b]setq vla-obj [b][color=RED]([/color][/b]vlax-ename->vla-object ent[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  18.                         [b][color=GREEN])[/color][/b]
  19.                 [b][color=MAROON])[/color][/b]
  20.                 [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]or [b][color=BLUE]([/color][/b]member [b][color=RED]([/color][/b]getvar 'errno[b][color=RED])[/color][/b] '[b][color=RED]([/color][/b]7 52[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b]null ent[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]princ [color=#2f4f4f]"\nYou missed, try again!"[/color][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  21.         [b][color=NAVY])[/color][/b][color=#8b4513]; while[/color]
  22.        
  23.         [b][color=NAVY]([/color][/b]if AcDocForB [b][color=MAROON]([/color][/b]vla-StartUndoMark AcDocForB[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][color=#8b4513]; Mark type: [color=#2f4f4f]"B"[/color][/color]
  24.        
  25.         [b][color=NAVY]([/color][/b]vla-GetBoundingBox vla-obj 'll 'ur[b][color=NAVY])[/color][/b]
  26.         [b][color=NAVY]([/color][/b]setq
  27.                 p1 [b][color=MAROON]([/color][/b]vlax-safearray->list ll[b][color=MAROON])[/color][/b]
  28.                 p2 [b][color=MAROON]([/color][/b]vlax-safearray->list ur[b][color=MAROON])[/color][/b]
  29.                 p3 [b][color=MAROON]([/color][/b]list [b][color=GREEN]([/color][/b]car p2[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]cadr p1[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] [color=#8b4513]; lr[/color]
  30.                 p4 [b][color=MAROON]([/color][/b]list [b][color=GREEN]([/color][/b]car p1[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]cadr p2[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] [color=#8b4513]; ul[/color]
  31.         [b][color=NAVY])[/color][/b]
  32.         [b][color=NAVY]([/color][/b]LWPoly-Red [b][color=MAROON]([/color][/b]list p1 p3 p2 p4[b][color=MAROON])[/color][/b] 1[b][color=NAVY])[/color][/b]
  33.        
  34.         [b][color=NAVY]([/color][/b]if AcDocForB [b][color=MAROON]([/color][/b]vla-EndUndoMark AcDocForB[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][color=#8b4513]; Mark type: [color=#2f4f4f]"B"[/color][/color]
  35.        
  36. [b][color=FUCHSIA])[/color][/b][color=#8b4513]; while T[/color]
  37. [b][color=FUCHSIA]([/color][/b]if AcDocForA [b][color=NAVY]([/color][/b]vla-EndUndoMark AcDocForA[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b][color=#8b4513]; Mark type: [color=#2f4f4f]"A"[/color][/color]
  38. [b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b]
  39. [b][color=BLACK])[/color][/b]
  40. [b][color=BLACK]([/color][/b]defun LWPoly-Red [b][color=FUCHSIA]([/color][/b]lst cls[b][color=FUCHSIA])[/color][/b]
  41. [b][color=FUCHSIA]([/color][/b]entmakex
  42.         [b][color=NAVY]([/color][/b]append
  43.                 [b][color=MAROON]([/color][/b]list
  44.                         [b][color=GREEN]([/color][/b]cons 0 [color=#2f4f4f]"LWPOLYLINE"[/color][b][color=GREEN])[/color][/b]
  45.                         [b][color=GREEN]([/color][/b]cons 100 [color=#2f4f4f]"AcDbEntity"[/color][b][color=GREEN])[/color][/b]
  46.                         [b][color=GREEN]([/color][/b]cons 100 [color=#2f4f4f]"AcDbPolyline"[/color][b][color=GREEN])[/color][/b]
  47.                         [b][color=GREEN]([/color][/b]cons 62 1[b][color=GREEN])[/color][/b]
  48.                         [b][color=GREEN]([/color][/b]cons 90 [b][color=BLUE]([/color][/b]length lst[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  49.                         [b][color=GREEN]([/color][/b]cons 70 cls[b][color=GREEN])[/color][/b]
  50.                 [b][color=MAROON])[/color][/b]
  51.                 [b][color=MAROON]([/color][/b]mapcar [b][color=GREEN]([/color][/b]function [b][color=BLUE]([/color][/b]lambda [b][color=RED]([/color][/b]p[b][color=RED])[/color][/b] [b][color=RED]([/color][/b]cons 10 p[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] lst[b][color=MAROON])[/color][/b]
  52.         [b][color=NAVY])[/color][/b]
  53. [b][color=FUCHSIA])[/color][/b]
  54. [b][color=BLACK])[/color][/b]

当谈到回报和评估时,我还是有点绿。
然而,我做了一系列关于vl catch-***函数的测试代码,在某些情况下还有lambda,所以这里有一些打印结果:
  1. (or
  2.         (setq AcDocForA (vla-get-ActiveDocument (vlax-get-acad-object)))
  3.         (setq AcDocForB (vla-get-ActiveDocument (vlax-get-acad-object)))
  4. )

这段代码实际上是2合1:(我没有发布两个单独的代码,而是只做了一个代码,其中分号必须放在您评论的以下行之一之前。
or subr在代码中没有实际用途(我只是为了更容易的修订而这样做-以后如果需要的话),而不会在代码中出现任何错误(我通常将代码的一部分包装在or中,因此这意味着有几个选项可以工作)。
另一种方法是通过键入“或者这也可以工作/或者这是另一个选项”在代码的每一行/块后面进行注释,但我发现使用实际的or函数更可读。
抱歉给你带来困惑-我有这些奇怪的习惯,这对你来说没有意义(包括(whilet…代码的一部分)。
顺便说一句,我测试了我的结束/撤消标记尝试,并更改了
  1. _$ (not
  2.                 (vl-catch-all-error-p ; if theres an error this returns T
  3.                         (vl-catch-all-apply
  4.                                 '(lambda ()
  5.                                         (vla-put-LayerOn (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))) :vlax-false)
  6.                                 )
  7.                         )
  8.                 )
  9.         )
  10. T
  11. _$ (vla-put-LayerOn (vla-get-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object))) :vlax-false)
  12. nil
  13. _$

因此,现在撤销操作正在正确执行。
非常感谢你的帮助!对不起,我的回答太愚蠢了,我太好奇了。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:30:02 | 显示全部楼层
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 07:44 , Processed in 0.377238 second(s), 64 queries .

© 2020-2025 乐筑天下

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