乐筑天下

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

[编程交流] 从两里中间画一条线

[复制链接]

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 08:03:33 | 显示全部楼层 |阅读模式
我的LISP程序创建了许多行来完成它的工作。我在一个区域,画的两条线需要连接在一条线的中点到另一条线的中点。
 
当然,这不起作用。在搜索中,我似乎没有找到任何关于如何使用LISP选择直线中点的信息。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 08:07:49 | 显示全部楼层
像往常一样,这个过程。。。当我想到一种新颖的方法时,我一点都不想点击post按钮。通过使用entget获取两条线的端点,然后使用一个小算法来计算中点,我解决了这个问题。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:13:31 | 显示全部楼层
只是一个建议
 
  1. (setq l1 (entlast))
  2. replace above with a defun
  3. (midptline)  this would call entlast and work out pt
  4. (seqt L1 mpt)   

 
你可以让它成为一个全球defun->acad。然后从任何例程调用它。虽然这里发布的建议几乎都是使用常见defuns库的单一解决方案,但如果你打算编写很多例程,尤其是像这样的例程,那么生活会变得更加轻松。删除层名称的硬编码,这是可以做到的。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 08:14:34 | 显示全部楼层
有各种各样的方法可以做到这一点,但是你的代码中有4点,也许是这样的:
  1. (defun midpoint (pt1 pt2 / )
  2. (mapcar '(lambda (a b) (/ (+ a b) 2.)) pt1 pt2))

然后简单地这样称呼它:
  1. (command "._LINE" "_None" (midpoint pt1 pt2) "_None" (midpoint pt3 pt4) "")

 
如果您甚至需要圆弧或多段线的中点,那么可以研究vlax曲线-*函数。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:20:34 | 显示全部楼层
  1. ;;;MidPoint Between 2 Point Using CAL
  2. ;;;ARG -> 2 Points
  3. ;;;RET -> PointList
  4. ;;; comment removed [pBe retarded mode ]
  5. (if (not (member "geomcal.arx" (arx)))
  6.    (arxload "geomcal")
  7.    )
  8. (defun midpt (p1 p2)(cal "(p1+p2)/2"))
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 08:23:28 | 显示全部楼层
虽然这很好(也是如何在lisp中获得cal调用的一个很好的示例),但这里有一个问题表明,使用ARX并不总是更好。
虽然所有3个都给出了相同的结果,但ARX实际上比正常的直接lisp思想慢得多。
这是因为在lispstringarx之间来回转换时的开销。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:25:59 | 显示全部楼层
 
哎呀,这太慢了。像乌龟一样慢。。。。像蜗牛一样慢。。。就像三趾树懒一样慢。。。像pBe打字技巧一样慢。。。。。
 
Irneb的观点。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 08:31:27 | 显示全部楼层
别误会我。这并不是说这是一个坏主意,在某些情况下,速度不算数(假设你得到两个拾取点之间的中点,然后由于用户单击这两个点所花费的时间,速度为零)。更不用说,这是一个5秒的差距32k分-所以在实践中,我认为没有人会注意到!
 
你的帖子确实展示了另一种选择,实际上它展示了更多
回复

使用道具 举报

4

主题

23

帖子

19

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 08:32:50 | 显示全部楼层
我认为这对你有帮助。。。。。。。
试试这个
 
  1. (setq pt1 (getpoint))
  2. (setq pt2 (getpoint))
  3. (command "line" pt1 pt2 "")
  4. (setq L1(entget(entlast)))
  5. (setq mid_pt1(polar pt1 (angle pt1 pt2) (/ (distance pt1 pt2) 2)))
  6. (setq pt3(getpoint))
  7. (setq pt4(getpoint))
  8. (command "line" pt3 pt4 "")
  9. (setq l2(entget(entlast)))
  10. (setq mid_pt2(polar pt3 (angle pt3 pt4) (/ (distance pt3 pt4) 2)))
  11. (command "line" mid_pt1 mid_pt2 "")
回复

使用道具 举报

4

主题

23

帖子

19

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 08:36:19 | 显示全部楼层
090333uavvkhva9n5p8haz.jpg
 
:)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 22:03 , Processed in 0.601439 second(s), 74 queries .

© 2020-2025 乐筑天下

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