martinle 发表于 2022-7-5 16:15:16

舱口2组

你好
 
我从表单中提取了以下代码行,并尝试进行更改。
我的问题是它并不总是有效。
不幸的是,我看不出为什么它经常有效,也经常无效。
 
此Lisp应:
 
图形中有多组对象。
图形已包含一些默认图案填充。
 
1) 用户选择现有图案填充,然后填充属于不同组的不同区域
用这个图案填充。
2) 当用户完成“_ADDSELECTED”命令后,Lisp应该将每个单独的图案填充添加到他们拥有的组中
封闭。
 
它经常工作,但并不总是如此!为什么?
请帮忙。
 
马丁
 
Lisp程序:
;;----------------------=={ Inside-p }==----------------------;;
;;                                                            ;;
;;Predicate function to determine whether a point lies      ;;
;;inside a supplied LWPolyline.                           ;;
;;------------------------------------------------------------;;
;;Author: Lee Mac - www.lee-mac.com                         ;;
;;Using some code by gile (as marked below), thanks gile.   ;;
;;------------------------------------------------------------;;
;;Arguments:                                                ;;
;;pt- 3D WCS point to test                              ;;
;;ent - LWPolyline Entity against which to test point       ;;
;;------------------------------------------------------------;;
;;Returns:T if supplied point lies inside supplied LWPoly ;;
;;------------------------------------------------------------;;

(defun LM:Inside-p (pt ent / _GroupByNum lst nrm obj tmp)

(defun _GroupByNum (l n / r)
   (if        l
   (cons
(reverse (repeat n
           (setq r (cons (car l) r)
               l (cdr l)
           )
           r
       )
)
(_GroupByNum l n)
   )
   )
)

(if (= (type ent) 'VLA-OBJECT)
   (setq obj ent
ent (vlax-vla-object->ename ent)
   )
   (setq obj (vlax-ename->vla-object ent))
)

(setq        lst
(_GroupByNum
   (vlax-invoke
   (setq tmp
          (vlax-ename->vla-object
              (entmakex
                (list
                  (cons 0 "RAY")
                  (cons 100 "AcDbEntity")
                  (cons 100 "AcDbRay")
                  (cons 10 pt)
                  (cons 11 (trans '(1. 0. 0.) ent 0))
                )
              )
          )
   )
   'IntersectWith
   obj
   acextendnone
   )
   3
)
)
(vla-delete tmp)
(setq nrm (cdr (assoc 210 (entget ent))))

;; gile:
(and
   lst
   (not (vlax-curve-getparamatpoint ent pt))
   (=
   1
   (rem
(length
(vl-remove-if
    (function
      (lambda (p / pa p- p+ p0 s1 s2)
        (setq pa (vlax-curve-getparamatpoint ent p))
        (or
          (and (equal (fix (+ pa
                              (if (minusp pa)
                                -0.5
                                0.5
                              )
                           )
                      )
                      pa
                      1e-8
             )
             (setq p-
                      (cond
                        ((setq p- (vlax-curve-getPointatParam
                                  ent
                                  (- pa 1e-
                                  )
                       )
                       (trans p- 0 nrm)
                        )
                        ((trans        (vlax-curve-getPointatParam
                                  ent
                                  (- (vlax-curve-getEndParam ent) 1e-
                                )
                                0
                                nrm
                       )
                        )
                      )
             )
             (setq p+
                      (cond
                        ((setq p+ (vlax-curve-getPointatParam
                                  ent
                                  (+ pa 1e-
                                  )
                       )
                       (trans p+ 0 nrm)
                        )
                        ((trans        (vlax-curve-getPointatParam
                                  ent
                                  (+ (vlax-curve-getStartParam ent) 1e-
                                )
                                0
                                nrm
                       )
                        )
                      )
             )
             (setq p0 (trans pt 0 nrm))
             (<= 0 (* (sin (angle p0 p-)) (sin (angle p0 p+))))
             ;; LM Mod
          )
          (and
          (/= 0. (vla-getBulge obj (fix pa)))
          (equal
              '(0. 0.)
              (cdr
                (trans (vlax-curve-getFirstDeriv ent pa) 0 nrm)
              )
              1e-9
          )
          )
        )
      )
    )
    lst
)
)
2
   )
   )
)
)
(defun c:hatch2group (/ ss i lst pt ent drehwink pt1 as OBJ AWS mypick)
(setq mypick (getvar "pickstyle"))
(setvar "pickstyle" 0)
(setq OBJ (entlast))
(command "_ADDSELECTED"
   Pause
   (setq pt1 (getpoint "\nPick Point: "))
)
(while (/= (getvar "CMDACTIVE") 0) (command pause))
(setq AWS (ssadd))
(while (setq OBJ (entnext OBJ)) (ssadd OBJ AWS))
(sssetfirst AWS AWS)
(setq as (entlast))
(if
   (and (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
(repeat (setq i (sslength ss))
   (setq lst (cons (ssname ss (setq i (1- i))) lst))
)
(setq pt pt1)
   )
    ;(if
      (setq ent
      (car
        (vl-member-if
          (function
          (lambda (x) (LM:Inside-p (trans pt 1 0) x))
          )
          lst
        )
      )
      )
;(vla-put-color (vlax-ename->vla-object ent) acRed)
   
)
(princ)
(command "_groupedit" ent "H" AWS "")
(while (/= (getvar "CMDACTIVE") 0) (command pause))
(setvar "pickstyle" mypick)
(princ)
)
(princ)
页: [1]
查看完整版本: 舱口2组