乐筑天下

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

[编程交流] Lisp识别采购订单中的变更

[复制链接]

4

主题

14

帖子

10

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 10:46:31 | 显示全部楼层 |阅读模式
好的,我已经完成了一个通过多段线(重多段线)的lisp。它在每个点上绘制一个圆,以表明它标识了每个点。现在,我必须修改这条多段线,但只要改变一些点的坐标,多段线仍然有相同数量的点。好的,我必须能够在lisp中创建一个例程,识别多段线的哪些点已经被更改,并且它绘制或插入这个修改点的坐标作为文本。绘制文本很容易,我很难识别折线的哪些点发生了变化。
 
我在想,也许有一种方法是修改例程并将其保存为另一个例程。一个例程是使用setq将原始多段线保存在一个变量中,然后第二个例程,即修改后的例程,将在两个变量之间进行比较(仅清楚地显示每个点的坐标),然后在文本中绘制差异,然而,这似乎不太方便用户使用,也不是一种真正有效的方法。
 
那么两个问题,有谁有更好的想法吗?有没有办法在lisp中只执行一个例程?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 11:02:05 | 显示全部楼层
你好
 
如果您支持代码,那么所有人都可以更容易地尝试提供帮助,如果您不想显示完整的例程。所以你可以把问题所在的部分带出来。
 
谢谢和问候
 
塔瓦特
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:14:19 | 显示全部楼层
可能使用ObjectReactor保存点/索引列表(在修改之前触发),并使用另一个回调(在修改之后触发)进行比较。
回复

使用道具 举报

4

主题

14

帖子

10

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:32:24 | 显示全部楼层
 
下面是通过多段线的代码。
 
  1. (defun c:rpoli()
  2.      (setq spoli (car (entsel "\nSelec. poligono. ")))
  3.      (setq bpoli (entget spoli))
  4.      (setq poli1 spoli)
  5.      (setq c (cdr (assoc 10 bpoli)))
  6.      (while (/= "SEQEND" (cdr (assoc '0 bpoli)))
  7.             (setq vert (cdr (assoc 10 bpoli)))
  8.         (command "circle" vert "0.5")
  9.             (setq spoli  (entnext spoli) bpoli (entget spoli))
  10.       );wh
  11. )

 
我是Lisp新手,但对AutoCad并不陌生,但还是新手。所以我还不知道很多事情,比如ObjectReactor,不知道那是什么。
 
我有一个想法,但是在lisp中保存有用数据时遇到了问题。例如,我在思考一个辅助变量,它在poli1中保存了我的spoli,就像我在那里提出的那样,那么要比较的程序将是(不完整的)。
 
  1. (defun c:dpoli()
  2.      (setq spoli (car (entsel "\nSelec. poligono. ")))
  3.      (setq bpoli (entget spoli))
  4.      (setq poli2 poli1)
  5.      (setq bpoli2 (entget poli2))
  6.      (setq c (cdr (assoc 10 bpoli)))
  7.      (while (/= "SEQEND" (cdr (assoc '0 bpoli)))
  8.             (setq vert (cdr (assoc 10 bpoli)))
  9.             (setq vert1 (cdr (assoc 10 bpoli2)))
  10.             (setq p (car vert))
  11.             (setq p1 (car vert1))
  12.             (if (/= p p1)
  13.                 (progn
  14.                 (command "text" pause "1.5" "90" (car vert))
  15.                 (command "text" pause "1.5" "90" (cadr vert))
  16.                 )
  17.             )                  
  18.             (setq spoli  (entnext spoli))
  19.             (setq poli2  (entnext poli2) bpoli (entget spoli) bpoli2 (entget poli2))
  20.      );wh
  21. )
  22. (princ "\n Iniciar Rutina que recorre un pol�*gono:rpoli")

 
这意味着先做rpoli,然后再做dpoli,然而,spoli只是实体的标识符,因此,当我运行dpoli时,它没有发现任何更改,因为它按现在的状态遍历实体的数据库,该数据库被修改,这意味着数据库poli1=poli2=spoli,我想要它,所以数据库poli1=poli2/=spoli,其中spoli是修改后的多段线,poli1和2是旧多段线的数据库。如何在修改多段线之前将其整个数据库保存在变量中,然后将其与修改时的实体进行比较?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:40:14 | 显示全部楼层
为了测试这个概念,我把它放在一起——它不是傻瓜式的,而且可能不适用于撤消,或者当对象被擦除时。
 
  1. (defun c:PolyChange nil
  2. (vl-load-com)
  3. ;; © Lee Mac 2010
  4. (  (lambda ( data mod can / react objLst )
  5.       (if (setq react
  6.             (vl-some
  7.               (function
  8.                 (lambda ( reactor )
  9.                   (if (eq data (vlr-data reactor)) reactor)
  10.                 )
  11.               )
  12.               (cdar
  13.                 (vlr-reactors :vlr-object-reactor)
  14.               )
  15.             )
  16.           )
  17.         (if (vlr-added-p react)
  18.           (progn
  19.             (vlr-remove react)
  20.             (setq *PolyData* nil)
  21.           )
  22.           (vlr-add react)
  23.         )
  24.         (setq react
  25.           (vlr-object-reactor
  26.             (progn
  27.               (setq *PolyData*
  28.                 (mapcar
  29.                   (function
  30.                     (lambda ( obj )
  31.                       (cons (vla-get-Handle obj)
  32.                         (LM:Variant->2DPoints
  33.                           (vla-get-Coordinates obj)
  34.                         )
  35.                       )
  36.                     )
  37.                   )
  38.                   (setq objLst
  39.                     (LM:ss->vla
  40.                       (ssget "_:L" '((0 . "LWPOLYLINE")))
  41.                     )
  42.                   )
  43.                 )
  44.               )
  45.               objLst
  46.             )
  47.             data
  48.             (list
  49.               (cons :vlr-modified  mod)
  50.               (cons :vlr-cancelled can)
  51.             )
  52.           )
  53.         )
  54.       )
  55.       (princ
  56.         (if (vlr-added-p react)
  57.           "\n** Reactor Activated **"
  58.           "\n** Reactor Deactivated **"
  59.         )
  60.       )
  61.       react
  62.     )
  63.    "Example-Reactor"
  64.    'PolyChange-Mod
  65.    'PolyChange-Can
  66. )
  67. (princ)
  68. )
  69. (defun PolyChange-Mod ( object reactor args / points verts hand )
  70. (vl-load-com)
  71. (if *CommandisCancelled*
  72.    (setq *CommandisCancelled* nil)   
  73.    
  74.    (if (and (not (vlax-erased-p object))
  75.             (setq points (cdr (assoc (setq hand (vla-get-Handle object)) *PolyData*))))
  76.      (progn      
  77.        (mapcar
  78.          (function
  79.            (lambda ( p q )
  80.              (or (equal p q 1e-6)
  81.                (entmakex (list (cons 0 "POINT") (cons 10 p)))
  82.              )
  83.            )
  84.          )
  85.          (setq verts (LM:Variant->2DPoints (vla-get-Coordinates object)))
  86.          points
  87.        )
  88.        (setq *PolyData*
  89.          (subst (cons hand verts) (assoc hand *PolyData*) *PolyData*)
  90.        )
  91.      )
  92.    )
  93. )
  94. (princ)
  95. )
  96.      
  97. (defun PolyChange-Can ( object reactor args )
  98. (setq *CommandisCancelled* t)
  99. (princ)
  100. )
  101. ;;-------------------=={ Variant Value }==--------------------;;
  102. ;;                                                            ;;
  103. ;;  Converts a VLA Variant into native AutoLISP data types    ;;
  104. ;;------------------------------------------------------------;;
  105. ;;  Author: Lee McDonnell, 2010                               ;;
  106. ;;                                                            ;;
  107. ;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
  108. ;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
  109. ;;------------------------------------------------------------;;
  110. ;;  Arguments:                                                ;;
  111. ;;  value - VLA Variant to process                            ;;
  112. ;;------------------------------------------------------------;;
  113. ;;  Returns:  Data contained within variant                   ;;
  114. ;;------------------------------------------------------------;;
  115. (defun LM:VariantValue ( value )
  116. ;; © Lee Mac 2010
  117. (cond
  118.    ( (eq 'variant (type value))
  119.      (LM:VariantValue (vlax-variant-value value))
  120.    )
  121.    ( (eq 'safearray (type value))
  122.      (mapcar 'LM:VariantValue (vlax-safearray->list value))
  123.    )
  124.    ( value )
  125. )
  126. )
  127. ;;-----------------=={ Group by Number }==--------------------;;
  128. ;;                                                            ;;
  129. ;;  Groups a list into a list of lists, each of length 'n'    ;;
  130. ;;------------------------------------------------------------;;
  131. ;;  Author: Lee McDonnell, 2010                               ;;
  132. ;;                                                            ;;
  133. ;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
  134. ;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
  135. ;;------------------------------------------------------------;;
  136. ;;  Arguments:                                                ;;
  137. ;;  l - List to process                                       ;;
  138. ;;  n - Number of elements by which to group                  ;;
  139. ;;------------------------------------------------------------;;
  140. ;;  Returns:  List of lists, each of length 'n'               ;;
  141. ;;------------------------------------------------------------;;
  142. (defun LM:GroupByNum ( l n / a b )
  143. ;; © Lee Mac 2010
  144. (while l
  145.    (
  146.      (lambda ( i )
  147.        (while (< 0 i)
  148.          (setq a (cons (car l) a) l (cdr l) i (1- i))
  149.        )
  150.        (setq b (cons (reverse a) b) a nil)
  151.      )
  152.      n
  153.    )
  154. )
  155. (reverse b)
  156. )
  157. ;;----------------=={ Variant->2DPoints }==-------------------;;
  158. ;;                                                            ;;
  159. ;;  Converts a Variant of Double type to a list of 2D Points  ;;
  160. ;;------------------------------------------------------------;;
  161. ;;  Author: Lee McDonnell, 2010                               ;;
  162. ;;                                                            ;;
  163. ;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
  164. ;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
  165. ;;------------------------------------------------------------;;
  166. ;;  Arguments:                                                ;;
  167. ;;  var - VLA Variant                                         ;;
  168. ;;------------------------------------------------------------;;
  169. ;;  Returns:  List of 2D Points                               ;;
  170. ;;------------------------------------------------------------;;
  171. (defun LM:Variant->2DPoints ( var )
  172. ;; © Lee Mac 2010
  173. (LM:GroupByNum (LM:VariantValue var) 2)
  174. )
  175. ;;-----------------=={ SelectionSet -> VLA }==----------------;;
  176. ;;                                                            ;;
  177. ;;  Converts a SelectionSet to a list of VLA Objects          ;;
  178. ;;------------------------------------------------------------;;
  179. ;;  Author: Lee McDonnell, 2010                               ;;
  180. ;;                                                            ;;
  181. ;;  Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
  182. ;;  Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
  183. ;;------------------------------------------------------------;;
  184. ;;  Arguments:                                                ;;
  185. ;;  ss - Valid SelectionSet (Pickset)                         ;;
  186. ;;------------------------------------------------------------;;
  187. ;;  Returns:  List of VLA Objects                             ;;
  188. ;;------------------------------------------------------------;;
  189. (defun LM:ss->vla ( ss )
  190. ;; © Lee Mac 2010
  191. (if ss
  192.    (
  193.      (lambda ( i / e l )
  194.        (while (setq e (ssname ss (setq i (1+ i))))
  195.          (setq l (cons (vlax-ename->vla-object e) l))
  196.        )
  197.        l
  198.      )
  199.      -1
  200.    )
  201. )
  202. )

 
键入“PolyChange”激活反应器,选择要监控的LWPoly。
 
然后尝试修改多边形(更改夹点或其他)。应在修改点处创建点。
 
再次键入“PolyChange”以停用反应器。
回复

使用道具 举报

4

主题

14

帖子

10

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:55:23 | 显示全部楼层
 
哇!很多命令我都不知道。非常感谢你,我会研究一下,看看如何让它为我工作。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 17:06 , Processed in 0.817686 second(s), 64 queries .

© 2020-2025 乐筑天下

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