乐筑天下

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

[编程交流] 比例法(替代

[复制链接]

37

主题

264

帖子

236

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2022-7-5 17:05:29 | 显示全部楼层 |阅读模式
大家好
出于缩放目的,我调整了一个例程,让我可以在Z方向缩放选择集。
工作正常,但缺点是它在“参照编辑模式”下不工作。
因为在3D中,很多工作都是在块内完成的,所以我真的在寻找一种不同于这种方法的方法——插入/清除方法。想用vla电话吗?
 
 
  1.   
  2. (defun C:SXYZ (/ SS IP XS YS ZS RA)
  3. (setvar "cmdecho" 0)
  4. (setq SS (ssget)
  5. IP (getpoint "Enter Base point (temp. blockname 'xstemp' will be used :")
  6. ) ;_ end of setq
  7. (initget 6)
  8. (setq XS (getreal "Enter X scale factor <1>:"))
  9. (initget 6)
  10. (setq YS (getreal "Enter Y scale factor (default=X):"))
  11. (setq ZS (getreal "Enter Z scale factor (default=X):")
  12. RA (getreal "Enter Rotation angle <0>:")
  13. ) ;_ end of setq
  14. (if (= XS NIL)
  15.    (setq XS 1)
  16. ) ;_ end of if
  17. (if (= YS NIL)
  18.    (setq YS XS)
  19. ) ;_ end of if
  20. (if (= ZS NIL)
  21.    (setq ZS XS)
  22. ) ;_ end of if
  23. (if (= RA NIL)
  24.    (setq RA 0)
  25. ) ;_ end of if
  26. (command
  27.    "block"  "xstemp" IP       SS ""  "insert" "xstemp"
  28.    IP      "xyz"    XS       YS ZS  RA   "explode"
  29.    "l"      "purge"  "b"      "xstemp" "n"
  30.   ) ;_ end of command
  31. )
回复

使用道具 举报

14

主题

76

帖子

63

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-5 17:15:49 | 显示全部楼层
 
  1. (vl-load-com)
  2. (defun c:test()
  3. (if
  4.    (setq p2 (getpoint "\nSpecify the insertion point:\n "))
  5.     (progn      
  6.       (setq _blkName "PONTO"
  7.      _scaleX 1.0
  8.      _scaleY 1.0
  9.      _scaleZ 1.0
  10.      _rotation 0
  11.       ) ;_ >setq
  12.       (setq vla-obj        (vla-insertblock
  13.           (
  14.            (if (eq (getvar "cvport") 1)
  15.              vla-get-paperspace
  16.              vla-get-modelspace
  17.            ) ;_ >if
  18.             (vla-get-ActiveDocument
  19.               (vlax-get-acad-object)
  20.             ) ;_ >vla-get-ActiveDocument
  21.           )
  22.           (vlax-3d-point p2)
  23.           _blkName
  24.           _scaleX
  25.           _scaleY
  26.           _scaleZ
  27.           _rotation
  28.         ) ;_ >vla-insertblock
  29.       ) ;_ >setq
  30.       (redraw (entlast) 1)
  31.       vla-obj
  32.     ) ;_ >progn
  33. ) ;_ >if  
  34. ) ;_ >defun

 
我希望这段代码能帮助你。
顺致敬意,
路易斯·奥古斯托
回复

使用道具 举报

37

主题

264

帖子

236

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2022-7-5 17:17:58 | 显示全部楼层
谢谢你,路易斯!我会试试的。。代码看起来很漂亮
 
 
 
编辑:
:在AutoCAD中没有测试结果
; 错误:自动化错误。文件服务器错误
 
我认为这一部分
(vlax-3d-点p2)
 
同样不起作用的是。。
 
  1. (vla-insertblock
  2.    (
  3.     (if (eq (getvar "cvport") 1)
  4.       vla-get-paperspace
  5.       vla-get-modelspace
  6.     ) ;_ >if
  7.      (vla-get-ActiveDocument
  8.        (vlax-get-acad-object)
  9.      ) ;_ >vla-get-ActiveDocument
  10.    )
  11.    (vlax-3d-point IP)
  12.    xstemp                                            ; is this correct? how to call a name by block?
  13.    XS
  14.    YS
  15.    ZS
  16.    RA
  17. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:24:26 | 显示全部楼层
另一个建议是对多个if使用cond
 
  1. (cond
  2.    ((= XS NIL)(setq XS 1))
  3.    ((= YS NIL)(setq YS XS))
  4.    ((= ZS NIL)(setq ZS XS))
  5.    ((= RA NIL)(setq RA 0))
  6. )
回复

使用道具 举报

14

主题

76

帖子

63

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-5 17:30:52 | 显示全部楼层
这就是我使用的参考资料。
我希望它能帮助你。
 
http://www.afralisp.net/archive/methods/lista/insertblock_method.htm
 
  1. (defun c:test ()
  2. ;---------------{sub function}---------------;
  3. (defun insBlock (
  4.            _blkName                ;string
  5.            _scaleX                ;real
  6.            _scaleY                ;real       
  7.            _scaleZ                ;real
  8.            _rotation                ;real
  9.            /
  10.            _blkInsertPoint
  11.            *error*
  12.           )
  13.    (defun *error* (errmsg)
  14.      (princ "\nAn error has occurred in the programme.\n ")
  15.      (prompt errmsg)
  16.      (princ)
  17.    ) ;_ >defun
  18.    (setq thisdrawing
  19.    (vla-get-activedocument
  20.      (vlax-get-acad-object)
  21.    ) ;_ >vla-get-activedocument
  22.    ) ;_ >setq
  23.    (setq mspace (vla-get-modelspace thisdrawing))
  24.    
  25.    (setq util (vla-get-utility thisdrawing))
  26.    (if        (not (tblsearch "BLOCK" _blkName))
  27.      (if
  28. (and
  29.   (setq filePath (findfile (strcat _blkName ".dwg")))
  30.   (progn (command "_.-insert" filePath nil) t)          
  31. ) ;_ >and
  32. (setq blkFlag t)
  33. (setq blkFlag nil)
  34.      ) ;_ >if
  35.      (setq blkFlag t)
  36.    ) ;_ >if
  37.    (if        blkFlag
  38.      (progn
  39. (setq _blkInsertPoint (vla-GetPoint util nil "\nInsertion Point: "))
  40. (setq vla-obj
  41.        (vla-insertblock
  42.          mspace
  43.          _blkInsertPoint
  44.          _blkName
  45.          _scaleX
  46.          _scaleY
  47.          _scaleZ
  48.          _rotation
  49.        ) ;_ >vla-insertblock
  50. ) ;_ >setq       
  51. (redraw (entlast) 1)
  52. vla-obj
  53.      ) ;_ >progn
  54.      (alert "Block not found.")
  55.    ) ;_ >if
  56. ) ;_ >defun
  57. ;---------------{sub function}---------------;
  58. (setq        vla-obj                ;get-vlaObject
  59. (insBlock        ;call sub function
  60.    "blkName"        ;your block name
  61.    1.0                ;scale x
  62.    1.0                ;scale y
  63.    1.0                ;scale z
  64.    0.0                ;rotation
  65. ) ;_ >insBlock
  66. ) ;_ >setq
  67. ) ;_ >defun
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:37:37 | 显示全部楼层
下面是另一个例子:
  1. (defun C:test ( / acDoc AcSpc MyBlockName XS YS ZS Rot insPt BlkRefObj )
  2. (setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  3. (setq        AcSpc
  4.         (vlax-get
  5.                 acDoc
  6.                 (if (= acModelSpace (vla-get-ActiveSpace acDoc))
  7.                         'ModelSpace
  8.                         (if (= (vla-get-mSpace acDoc) :vlax-true)
  9.                                 'ModelSpace
  10.                                 'PaperSpace
  11.                         )
  12.                 )
  13.         )
  14. )'; setq
  15. (setq
  16.         MyBlockName "MyBlock"
  17.         XS 1.0
  18.         YS 1.0
  19.         ZS 1.0
  20.         Rot 0.0 ; Value in degrees
  21. ); setq
  22. (if
  23.         (and
  24.                 (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-Blocks acDoc) MyBlockName))))
  25.                 (setq insPt (getpoint (strcat "\nSpecify "" MyBlockName "" insertion point: ")))
  26.         )
  27.         (setq BlkRefObj (vla-InsertBlock AcSpc (vlax-3D-point insPt) MyBlockName XS YS ZS (* pi (/ Rot 180))))
  28. )
  29. (princ)
  30. );| defun |; (or (vlax-get-acad-object) (vl-load-com)) (princ)
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:41:03 | 显示全部楼层
AFAIK原始代码的问题是使用了_BLOCK命令,而不是_INSERT命令。创建替代插入代码虽然很有趣,但不会解决OP的问题。
回复

使用道具 举报

14

主题

76

帖子

63

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-5 17:48:23 | 显示全部楼层
....
回复

使用道具 举报

37

主题

264

帖子

236

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2022-7-5 17:54:34 | 显示全部楼层
谢谢你们的回复伙计们
Luis很好,但只在“正常”模式下工作,而不是在块编辑器中。
 
 
命令:#
命令:**检测到自参考:
1块参考未添加到工作集。
 
 
我想。。
 
 
-除了操纵“作为块”之外,没有其他方法可以“变形”XYZ
-一种方法作为解决方法。。
 
 
1.“refset”=>删除选定项=>
2.“参考关闭”
3、选择SXYZ
4.“refedit”上一个阻止您在其中工作。。
5.“refset”=>添加所选(缩放)。完成。
 
 
这正是手动完成的。。。自动化后速度更快
一些好的“refset”添加/删除和Refedit函数。。。正在搜索-参照编辑
回复

使用道具 举报

14

主题

76

帖子

63

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-5 17:58:51 | 显示全部楼层
你试过使用entmod函数吗?
 
我想我的知识可能不足以帮助你。
 
你可以发一张样品图让我们试试吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 09:17 , Processed in 0.466865 second(s), 72 queries .

© 2020-2025 乐筑天下

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