乐筑天下

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

[编程交流] 重写divide命令

[复制链接]

218

主题

699

帖子

483

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1090
发表于 2022-7-5 23:26:18 | 显示全部楼层 |阅读模式
你好
 
作为学习的一部分,我尝试重新编写knowen命令,
这次划分
 
我设法写了这个
 
  1. (defun C:test        (/ line d x seg i loc)
  2.    (setvar "PDMODE" 34)
  3.    (setq line (entget (car (entsel))))
  4.    (setq d (distance (cdr (assoc 10 line)) (cdr (assoc 11 line))))
  5.    (setq x (getint "how many segments"))
  6.    (setq seg (/ d x))
  7.    (setq i 0)
  8.    (repeat x
  9.    (setq loc (polar (cdr (assoc 10 line)) pi i))
  10.      (entmake
  11. (list
  12.   '(0 . "POINT")
  13.   '(100 . "AcDbEntity")
  14.   '(67 . 0)
  15.   '(410 . "Model")
  16.   '(8 . "0")
  17.   '(100 . "AcDbPoint")
  18.    (cons 10 loc))
  19.      )
  20.      (setq i (+ i seg))
  21.    )
  22. )

 
问题是我引导极轴的方向,我不知道用户是如何画这条线的,我给了它pi作为常数,但它可以是任何其他角度,我怎么做?
 
谢谢
谢伊
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 23:46:27 | 显示全部楼层
2.我不会使用保留字“Line”作为变量,这可能会导致问题,例如“Aline”second is(setq ang(angle pt1 pt2))在polar中使用它,它是您的行的正确角度
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 23:56:56 | 显示全部楼层
嗨,Shay,
除了BIGAL已经说过的,我建议在程序中添加一些测试,例如验证要除法的实体类型(“行”)和有效的除法器数。
我还建议不要在enstsel函数中使用entget,因为如果用户选择失败,或按enter键,将向命令行“选择对象:;错误:错误参数类型:lentyp nil”发送错误
由于要分割的实体始终是一条“线”,并且始终是一个开放对象,因此要输入的点数将是输入的线段数减去一。
 
  1. (defun C:test (/ A B D LIN SEG SEL X)
  2. (setvar "PDMODE" 34)
  3. (if (and (setq sel (car (entsel "\nSelect a line to divide <exit>: ")))
  4.       (setq lin (entget sel))
  5.       (eq (cdr (assoc 0 lin)) "LINE")
  6.       (not (initget 6))
  7.       (setq x (getint "\nHow many segments <exit>: "))
  8.      );; and
  9.    (progn
  10.      (setq d (distance    (setq a (cdr (assoc 10 lin)))
  11.            (setq b (cdr (assoc 11 lin)))
  12.          )
  13.      )
  14.      (setq seg (/ d x))
  15.      (repeat (1- x)
  16.    (setq a (polar a (angle a b) seg))
  17.    (entmake
  18.      (list
  19.        '(0 . "POINT")
  20.        '(100 . "AcDbEntity")
  21.        '(67 . 0)
  22.        '(410 . "Model")
  23.        '(8 . "0")
  24.        '(100 . "AcDbPoint")
  25.        (cons 10 a)
  26.      )
  27.    );; entmake
  28.      );; repeat
  29.    );; progn
  30. );; if
  31. (princ)
  32. );; test

为了不必测试实体类型,更容易强制选择正确的实体类型:
  1. (defun C:test (/ A B D LIN SEG SS X)
  2. (setvar "PDMODE" 34)
  3. (if (and (not (prompt "\nSelect a line to divide <exit>: "))
  4.       (setq ss (ssget "_+.:E:S" '((0 . "LINE"))))
  5.       (not (initget 6))
  6.       (setq x (getint "\nHow many segments <exit>: "))
  7.      );; and
  8.    (progn
  9.      (setq lin (entget (ssname ss 0)))
  10.      (setq d (distance    (setq a (cdr (assoc 10 lin)))
  11.            (setq b (cdr (assoc 11 lin)))
  12.          )
  13.      )
  14.      (setq seg (/ d x))
  15.      (repeat (1- x)
  16.    (setq a (polar a (angle a b) seg))
  17.    (entmake
  18.      (list
  19.        '(0 . "POINT")
  20.        '(100 . "AcDbEntity")
  21.        '(67 . 0)
  22.        '(410 . "Model")
  23.        '(8 . "0")
  24.        '(100 . "AcDbPoint")
  25.        (cons 10 a)
  26.      )
  27.    );; entmake
  28.      );; repeat
  29.    );; progn
  30. );; if
  31. (princ)
  32. );; test

为了发展另一种实体类型,可能是这样的:
  1. (defun C:test (/ A D I OBJ SEG SEL X)
  2. (vl-load-com)
  3. (setvar "PDMODE" 34)
  4. (if (and (not (prompt "\nSelect a line to divide <exit>: "))
  5.       (setq ss (ssget "_+.:E:S" (list (cons 0 "LINE,ARC,*POLYLINE,CIRCLE,SPLINE,ELLIPSE"))))
  6.       (not (initget 6))
  7.       (setq x (getint "\nHow many segments <exit>: "))
  8.      );; and
  9.    (progn
  10.      (setq obj (vlax-ename->vla-object (ssname ss 0)))
  11.      (setq d (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)))
  12.      (setq seg (/ d x))
  13.      (if (equal (vlax-curve-getstartpoint obj) (vlax-curve-getendpoint obj))
  14.    (setq rep x)
  15.    (setq rep (1- x))
  16.    );; if
  17.      (setq i 0)
  18.      (repeat rep
  19.    (setq a (vlax-curve-getPointAtDist obj (setq i (+ seg i))))
  20.    (entmake
  21.      (list
  22.        '(0 . "POINT")
  23.        '(100 . "AcDbEntity")
  24.        '(67 . 0)
  25.        '(410 . "Model")
  26.        '(8 . "0")
  27.        '(100 . "AcDbPoint")
  28.        (cons 10 a)
  29.      )
  30.    );; entmake
  31.      );; repeat
  32.    );; progn
  33. );; if
  34. (princ)
  35. );; test

HTH公司
亨里克
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 00:04:07 | 显示全部楼层
我更喜欢这样:
 
  1. [color=#8b4513];;;ARG => lineEName segQuantity[/color]
  2. [b][color=BLACK]([/color][/b]defun ldivid [b][color=FUCHSIA]([/color][/b]en q / ed p10 p11 d i[b][color=FUCHSIA])[/color][/b]
  3. [b][color=FUCHSIA]([/color][/b]setq ed [b][color=NAVY]([/color][/b]entget en[b][color=NAVY])[/color][/b]
  4.       p10 [b][color=NAVY]([/color][/b]cdr [b][color=MAROON]([/color][/b]assoc 10 ed[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  5.       p11 [b][color=NAVY]([/color][/b]cdr [b][color=MAROON]([/color][/b]assoc 11 ed[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  6.         d [b][color=NAVY]([/color][/b]/ [b][color=MAROON]([/color][/b]distance p10 p11[b][color=MAROON])[/color][/b] q[b][color=NAVY])[/color][/b]
  7.         i 1[b][color=FUCHSIA])[/color][/b]
  8. [b][color=FUCHSIA]([/color][/b]repeat [b][color=NAVY]([/color][/b]1- q[b][color=NAVY])[/color][/b]
  9.     [b][color=NAVY]([/color][/b]entmake [b][color=MAROON]([/color][/b]list [b][color=GREEN]([/color][/b]cons 0 [color=#2f4f4f]"POINT"[/color][b][color=GREEN])[/color][/b]
  10.                    [b][color=GREEN]([/color][/b]cons 10 [b][color=BLUE]([/color][/b]polar p10 [b][color=RED]([/color][/b]angle p10 p11[b][color=RED])[/color][/b] [b][color=RED]([/color][/b]* d i[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  11.     [b][color=NAVY]([/color][/b]setq i [b][color=MAROON]([/color][/b]1+ i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  12. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
 
 
如果这条线是3D的,那么这里的问题就解决了。代替(极坐标)调用,您必须计算点值。
 
-大卫
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 00:17:11 | 显示全部楼层
包括3D值;
 
虽然我确信有mapcar lambda解决方案,但基本想法是将x、y和z增量的百分比添加到起点:
 
  1. [b][color=BLACK]([/color][/b]defun l3divid [b][color=FUCHSIA]([/color][/b]en q / ed p10 p11 d xd yd zd i pt[b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]setq ed [b][color=NAVY]([/color][/b]entget en[b][color=NAVY])[/color][/b]
  3.       p10 [b][color=NAVY]([/color][/b]cdr [b][color=MAROON]([/color][/b]assoc 10 ed[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  4.       p11 [b][color=NAVY]([/color][/b]cdr [b][color=MAROON]([/color][/b]assoc 11 ed[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  5.         d [b][color=NAVY]([/color][/b]mapcar '- p11 p10[b][color=NAVY])[/color][/b]
  6.        xd [b][color=NAVY]([/color][/b]* [b][color=MAROON]([/color][/b]car d[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]/ 1. q[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  7.        yd [b][color=NAVY]([/color][/b]* [b][color=MAROON]([/color][/b]cadr d[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]/ 1. q[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  8.        zd [b][color=NAVY]([/color][/b]* [b][color=MAROON]([/color][/b]caddr d[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]/ 1. q[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  9.         i 1[b][color=FUCHSIA])[/color][/b]
  10. [b][color=FUCHSIA]([/color][/b]repeat [b][color=NAVY]([/color][/b]1- q[b][color=NAVY])[/color][/b]
  11.     [b][color=NAVY]([/color][/b]setq pt [b][color=MAROON]([/color][/b]mapcar '+ p10 [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]* i xd[b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b]* i yd[b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b]* i zd[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  12.     [b][color=NAVY]([/color][/b]entmake [b][color=MAROON]([/color][/b]list [b][color=GREEN]([/color][/b]cons 0 [color=#2f4f4f]"POINT"[/color][b][color=GREEN])[/color][/b]
  13.                    [b][color=GREEN]([/color][/b]cons 10 pt[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  14.     [b][color=NAVY]([/color][/b]setq i [b][color=MAROON]([/color][/b]1+ i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  15. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
 
-大卫
回复

使用道具 举报

1

主题

116

帖子

115

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 00:38:02 | 显示全部楼层
希望你不要对所有不同的方法感到困惑。。。这与David的上一个方法类似(不使用polar)。我可以想到另一种使用mapcar lambda的方法。
  1. (defun c:lndiv ( / cnt lin no pt sel )
  2. (if (and (setq sel (car (entsel "\nSelect a line to divide <exit>: ")))
  3.           (setq lin (entget sel))
  4.           (eq (cdr (assoc 0 lin)) "LINE")
  5.           (not (initget 6))
  6.           (setq no (getint "\nHow many segments <exit>: "))
  7.           )
  8.    ((lambda ( vect )
  9.       (setq cnt 1)
  10.       (repeat (1- no)
  11.         (entmake (list '(0 . "POINT")
  12.                        (cons 10 (mapcar
  13.                                   '(lambda ( a b )
  14.                                      (+ a (* cnt b))
  15.                                      )
  16.                                   pt
  17.                                   vect
  18.                                   )
  19.                              )
  20.                        )
  21.                  )
  22.         (setq cnt (1+ cnt))
  23.         )
  24.       )
  25.      (mapcar
  26.        '(lambda ( a b )
  27.           (/ (- b a) no)
  28.           )
  29.        (setq pt (cdr (assoc 10 lin)))
  30.        (cdr (assoc 11 lin))
  31.        )
  32.      )
  33.    )
  34. (princ)
  35. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-18 04:15 , Processed in 3.171431 second(s), 65 queries .

© 2020-2025 乐筑天下

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