乐筑天下

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

[编程交流] 三角形延长

[复制链接]

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 11:32:15 | 显示全部楼层 |阅读模式
大家好,由于我对autolisp还很陌生,我想知道是否有人可以快速向我展示一种方法来执行以下操作:
 
运行lisp或宏,允许我拾取一组线,然后输入一个距离,并将这些线的两侧延长该距离。
 
我猜这对很多人来说都不是什么挑战,因为我在这些论坛上看到了一些令人印象深刻的代码
 
谢谢
马特
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 11:47:27 | 显示全部楼层
也许是这样的。。。
  1. (defun c:TEst (/ #SS #Dist)
  2. (vl-load-com)
  3. (and (setq #SS (ssget "_:L" '((0 . "LINE,LWPOLYLINE"))))
  4.       (setq #Dist (getdist "\nSpecify length: "))
  5.       (foreach x (vl-remove-if 'listp (mapcar 'cadr (ssnamex #SS)))
  6.         (vl-cmdf "_.lengthen"
  7.                  "_delta"
  8.                  #Dist
  9.                  (list x (vlax-curve-getendpoint x))
  10.                  (list x (vlax-curve-getstartpoint x))
  11.                  ""
  12.         ) ;_ vl-cmdf
  13.       ) ;_ foreach
  14. ) ;_ and
  15. (princ)
  16. ) ;_ defun
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 11:56:06 | 显示全部楼层
这很好用,非常感谢alanjt!
 
马特
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 12:09:17 | 显示全部楼层
 
没问题。我不是一个给你鱼,但对于这样一个简单的问题,它只是更好地从常规开始。一定要看一遍,这样你才能理解它;我不介意回答问题。
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:12:33 | 显示全部楼层
所以我一直在看这个lisp的代码,我在vlisp上遇到了一些问题@以下几行:
 
 
1: (foreach x(vl remove if“listp(mapcar)”cadr(ssnamex#SS)))
 
2: (列表x(vlax curve getendpoint x))
 
3: (列表x(vlax曲线getstartpoint x))
 
也许我可以得到一些澄清?尤其是第一行。非常感谢你。
 
马特
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 12:30:10 | 显示全部楼层
对于问题1:
[列表]
  • ssnamex返回选择集中每个实体的创建方式。在此列表中,所有实体都位于子列表中。
  • mapcar遍历给定列表,对每个项目执行特定功能,并返回一个新处理的列表。
  • cadr提取列表中的第二项。(mapcar的cadr#List)将提取#List内每个子列表中的第二项
  • vl remove if“listp将从新进程列表中删除LST(列表)类型的所有对象。
    通过执行此操作,我可以创建一个仅包含提取的名称(实体)的列表,从那里我可以逐步浏览列表并执行我需要的任何操作。您还可以使用while或repeat和ssname单步遍历选择集。这甚至有点快,但在这一刻,我想用上述方法(不止一种方法去剥猫皮)。
  • 回复

    使用道具 举报

    54

    主题

    3755

    帖子

    3583

    银币

    后起之秀

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

    铜币
    438
    发表于 2022-7-6 12:33:38 | 显示全部楼层
    问题2和3:
    [列表]
  • Lengthen和许多其他类似功能在选择对象时,除了ename(实体)外,还需要/使用一个点,以正确了解用户选择的实体上的位置
  • 我所做的是提取所选行的端点和起点,并将其与ename结合以馈送到lenghten。这确保了我可以延长这两条线。
    类似地,将一个ename馈送到一个函数,如果没有提供一个点,很多时候你会收到不同的结果-这并不适用于所有命令函数。
     
    例如:
    1. ;;; without point
    2. (defun c:Test (/ e)
    3. (and (setq e (entsel "\nSelect line: "))
    4.       (command "_.lengthen" "_delta" 10. (car e) "")))
    5. ;;; with point
    6. (defun c:Test (/ e)
    7. (and (setq e (entsel "\nSelect line: "))
    8.       (command "_.lengthen" "_delta" 10. e "")))

     
    您会注意到,使用第一个函数(无点),有时可能会在选择线的另一端延伸。
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-6 02:17 , Processed in 0.368534 second(s), 66 queries .

    © 2020-2025 乐筑天下

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