乐筑天下

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

[编程交流] 除法lisp

[复制链接]

5

主题

14

帖子

9

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 15:55:55 | 显示全部楼层 |阅读模式
我还有一个Lisp程序的要求。
 
我需要将许多直线(包括圆弧)等长分割。然而,我正在寻找一种更快(lisp例程将是很棒的)的方法来完成具有特定参数的任务。
 
在创建所需的总线段长度,然后等长分割完成后,我必须将线段从该分割点向后每侧切割1/4“或3/8”,创建1/2”或3/4“间隙,然后将整个线段的每一端缩短相同的切割长度(1/4或3/8)。这样就可以得到相等的线段,线段之间有间隙。我可以分开做数学运算,创建一条等距线,然后将它们与间隙端对端放置,但这也很耗时,而且对于弧线来说并不适用。
 
用Lisp程序可以这样做吗?请参阅图片以供参考。x是分界点,在我必须结束的地方,有一个用dims创建的间隙。
 
谢谢所有的Lisp程序专家。你们太棒了。
RW公司
 
165557m2c5vbl6ta4qbaat.png
 
165558f04r9fi4ebbayjb9.png
回复

使用道具 举报

6

主题

49

帖子

42

银币

初来乍到

Rank: 1

铜币
32
发表于 2022-7-5 16:33:54 | 显示全部楼层
也许可以从头开始创建线条,而不是修改屏幕上的内容。在使用entmake绘制线段之前,使用getxxx函数提示输入变量。
 
使用Tapatalk从my Pixel XL发送
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:36:49 | 显示全部楼层
我认为你的规则有点生硬,没有双关语的意思,最好是指定所需的数字,并留一个空白,这将给出每个部分的长度。
 
对此没有太多考虑,但长度=num*dist-(num*2*gap)gap可以吗?否则必须重做dist。
 
一旦规则制定出来,重做直线和圆弧实际上是最容易的。使用1/4或1/2范围的橡皮筋可能会有问题。如果不满足此规则,会发生什么。
 
可以在dwg中发布一些示例吗。
回复

使用道具 举报

6

主题

122

帖子

118

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 17:10:36 | 显示全部楼层
我使用Alan Thompson的这个例程沿着一个对象(包括曲线)打断
  1. (defun c:BAD (/ *error* AT:GetSel AT:DrawX _getDist ent pnt cmd undo total add dist break)
  2. ;; Break curve At Distance
  3. ;; Alan J. Thompson, 09.21.11
  4. ;; http://www.theswamp.org/index.php?topic=39550.0;all
  5. (vl-load-com)
  6. (defun *error* (msg)
  7.    (and cmd (setvar 'CMDECHO cmd))
  8.    (and *AcadDoc* (vla-endundomark *AcadDoc*))
  9.    (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
  10.      (princ (strcat "\nError: " msg))
  11.    )
  12. )
  13. (defun AT:GetSel (meth msg fnc / ent)
  14.    ;; meth - selection method (entsel, nentsel, nentselp)
  15.    ;; msg - message to display (nil for default)
  16.    ;; fnc - optional function to apply to selected object
  17.    ;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
  18.    ;; Alan J. Thompson, 05.25.10
  19.    (setvar 'ERRNO 0)
  20.    (while
  21.      (progn (setq ent (meth (cond (msg)
  22.                                   ("\nSelect object: ")
  23.                             )
  24.                       )
  25.             )
  26.             (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
  27.                   ((eq (type (car ent)) 'ENAME)
  28.                    (if (and fnc (not (fnc ent)))
  29.                      (princ "\nInvalid object!")
  30.                    )
  31.                   )
  32.             )
  33.      )
  34.    )
  35.    ent
  36. )
  37. (defun AT:DrawX (P C)
  38.    ;; Draw and "X" vector at specified point
  39.    ;; P - Placement point for "X"
  40.    ;; C - Color of "X" (must be integer b/w 1 & 255)
  41.    ;; Alan J. Thompson, 10.31.09
  42.    (if (vl-consp P)
  43.      ((lambda (d)
  44.         (grvecs (cons C
  45.                       (mapcar (function (lambda (n) (polar P (* n pi) d)))
  46.                               '(0.25 1.25 0.75 1.75)
  47.                       )
  48.                 )
  49.         )
  50.         P
  51.       )
  52.        (* (getvar 'viewsize) 0.02)
  53.      )
  54.    )
  55. )
  56. (defun _getDist (total point / dist)
  57.    (and undo (initget "Undo"))
  58.    (cond ((not (setq dist (getdist (AT:DrawX point 4)
  59.                                    (strcat
  60.                                      "\nDistance at which to break curve (Total= "
  61.                                      (rtos total)
  62.                                      (if undo
  63.                                        ") [undo]: "
  64.                                        "): "
  65.                                      )
  66.                                    )
  67.                           )
  68.                )
  69.           )
  70.           nil
  71.          )
  72.          ((eq dist "Undo") dist)
  73.          ((not (< 0. dist total))
  74.           (princ (strcat "\nValue must be between 0.0 and and " (rtos total) "!"))
  75.           (_getDist total point)
  76.          )
  77.          (dist)
  78.    )
  79. )
  80. (vla-startundomark
  81.    (cond (*AcadDoc*)
  82.          ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
  83.    )
  84. )
  85. (if (setq ent (AT:GetSel
  86.                  entsel
  87.                  "\nSelect curve to break: "
  88.                  (lambda (x)
  89.                    (and (wcmatch (cdr (assoc 0 (entget (car x))))
  90.                                  "ARC,LINE,*POLYLINE,SPLINE"
  91.                         )
  92.                         (not (vlax-curve-isClosed (car x)))
  93.                    )
  94.                  )
  95.                )
  96.      )
  97.    (progn
  98.      (setq pnt (trans (cadr ent) 1 0)
  99.            ent (car ent)
  100.            cmd (getvar 'CMDECHO)
  101.      )
  102.      (setvar 'CMDECHO 0)
  103.      (while
  104.        (setq
  105.          dist (_getDist (setq total (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))
  106.                         (setq pnt
  107.                                (trans (if (> (vlax-curve-getParamAtPoint
  108.                                                ent
  109.                                                (vlax-curve-getClosestPointToProjection ent pnt '(0. 0. 1.))
  110.                                              )
  111.                                              (vlax-curve-getParamAtDist ent (/ total 2.))
  112.                                           )
  113.                                         (progn (setq add total) (vlax-curve-getEndPoint ent))
  114.                                         (progn (setq add 0.) (vlax-curve-getStartPoint ent))
  115.                                       )
  116.                                       0
  117.                                       1
  118.                                )
  119.                         )
  120.               )
  121.        )
  122.         (if (eq dist "Undo")
  123.           (progn (vl-cmdf "_.U")
  124.                  (setq ent  (caar undo)
  125.                        pnt  (cadar undo)
  126.                        undo (cdr undo)
  127.                  )
  128.           )
  129.           (progn
  130.             (setq break (trans (vlax-curve-getPointAtDist ent (abs (- add dist))) 0 1))
  131.             (command-s "_.break" ent "_F" "_non" break "_non" break)
  132.             (setq undo (cons (list ent pnt) undo))
  133.             (and (zerop add) (setq ent (entlast)))
  134.           )
  135.         )
  136.         (redraw)
  137.         (foreach p (vl-remove (last undo) undo) (AT:DrawX (cadr p) 1))
  138.      )
  139.    )
  140. )
  141. (*error* nil)
  142. (princ)
  143. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 20:21 , Processed in 0.448538 second(s), 63 queries .

© 2020-2025 乐筑天下

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