aleksa32 发表于 2022-7-6 10:17:26

如何突出封闭区域

我正在为一个选择集制作一个点列表,为了识别由它们包围的那些对象,我用这些点之间连接的GRVEC表示。现在,我想知道是否有一种方法可以在选择这些点时突出显示由这些点包围的区域(以WP或CP在选择时工作的方式)。
它不必使用向量,任何已知的方法(如果存在)都是受欢迎的:)
 
提前感谢

Lee Mac 发表于 2022-7-6 10:25:43

我很想看看是否有人提供了一种方法来实现这一点-我个人想不出一种通过LISP的方法(当然,如果不使用穿过区域的向量,但这不会是半透明的)。

David Bethel 发表于 2022-7-6 10:33:46

我认为我不太明白整个意思。
 
这应该突出显示完全在(窗口)选择区域内的实体
 
我认为穿越会有点混乱。
 

(defun c:sel-hl (/ pt1 pt2 pl wl tl gl i ss en)
(initget 1)
(setq pt1 (getpoint "\nStart Point:   "))
(setq pl (list pt1))

(while (setq pt2 (getpoint pt1 "\nNext Point:   "))
      (setq pl (cons pt2 pl)
             pt1 pt2
            wl (cons (last pl) pl)
            tl wl
            gl '())
      (repeat (length pl)
            (setq gl (append gl (list 2 (car tl) (cadr tl)))
                  tl (cdr tl)))
      (redraw)
      (apply 'grvecs (list gl))
      (and (setq i -1 ss (ssget "_WP" wl))
             (while (setq en (ssname ss (setq i (1+ i))))
                  (redraw en 3))))
(prin1))

 
 
或者您正在尝试对选择区域进行着色?同样,窗口和交叉将产生两种看起来非常不同的解决方案-大卫

David Bethel 发表于 2022-7-6 10:37:18

(重画)在不同版本上的效果不同。您可能需要强制重新生成或使用(重画en 1)再次跨过集合以取消突出显示内容-大卫

Lee Mac 发表于 2022-7-6 10:43:02

David I可能错了,但我认为Aleksa指的是在对象上打开窗口时的半透明着色:
 
夸张的例子:
 

aleksa32 发表于 2022-7-6 10:49:31

谢谢你的回复。
李,你完全理解我。大卫很抱歉,如果我不清楚我想达到什么目的,但英语不是我的母语,所以我没有想到像半透明阴影这样明显的方式来解释它。无论如何,你已经为我解决了一个进退两难的问题。
非常感谢!!!!

Lee Mac 发表于 2022-7-6 10:51:32

正如我所说,对于向量,但不是半透明的:
 
 

;;------------------=={ Shaded SelectionSet}==--------------;;
;;                                                            ;;
;;Provides a UCS oriented window/crossing selection set   ;;
;;interface, with shading visual effect.                  ;;
;;------------------------------------------------------------;;
;;Author: Lee McDonnell, 2010                               ;;
;;                                                            ;;
;;Copyright © 2010 by Lee McDonnell, All Rights Reserved.   ;;
;;Contact: Lee Mac @ TheSwamp.org, CADTutor.net             ;;
;;------------------------------------------------------------;;
;;Arguments:                                                ;;
;;str    - prompt string                                    ;;
;;p1   - base point for window (UCS)                      ;;
;;filter - optional selection set filter                  ;;
;;------------------------------------------------------------;;
;;Returns:SelectionSet of selected objects, else nil      ;;
;;------------------------------------------------------------;;

(defun LM:GrSelectionSetShaded ( str p1 filter / gr p1 pt1 pt2 vsr hgt wid s1 s2 c1 c2 pi/2 lst )
;; © Lee Mac 2010
(princ str)

(while (and (= 5 (car (setq gr (grread t 13 1)))) (listp (setq p3 (cadr gr))))
   (redraw)

   (setq vsr(/ (getvar 'VIEWSIZE) (cadr (getvar 'SCREENSIZE)))
         p2   (list (car p3) (cadr p1) (caddr p3))
         p4   (list (car p1) (cadr p3) (caddr p3))
         hgt(- (cadr p3) (cadr p1))
         wid(- (carp3) (carp1))         
         s1   (if (minusp wid)-1.1.) s2 (if (minusp hgt)-1.1.)
         c1   (if (minusp wid) -256 256) c2 (if (minusp wid)106 156) pi/2 (/ pi 2.) i 0
         hgt(- hgt (* vsr 2. s2))
   )
   (grvecs (setq lst (list c1 p1 p2 p1 p4 p2 p3 p4 p3)))

   (repeat (1- (fix (/ (abs wid) vsr)))
   (grdraw (setq p5 (polar (polar p1 0. (* s1 (setq i (1+ i)) vsr)) pi/2 (* s2 vsr))) (polar p5 pi/2 hgt) c2)
   )
)
(redraw)
(ssget (if (minusp (car lst)) "_C" "_W") p1 p3 filter)
)


;; Test Function

(defun c:test ( / p )
(if (setq p (getpoint "\nClick!: "))
   (sssetfirst nil (LM:GrSelectionSetShaded "\nCorner..." p nil))
)

(princ)
)(测试类型)

aleksa32 发表于 2022-7-6 11:00:52

谢谢李的回复。正如你已经知道的那样,这不是我想要的,但我很想看看你是如何将选择窗口着色的。所以我无意中学到了一些新东西:)

Lee Mac 发表于 2022-7-6 11:01:39

没错,我知道我们可以实现半透明,但我对向量解很好奇

alanjt 发表于 2022-7-6 11:08:44

我看到了这一点,从来没有机会发表回应(和孩子们一起度过的疯狂周末)。由于这都是学术性的,这里有一个非常快速和粗糙的方法(使用窗口形状)。
这没有实际用途,因此没有解释非WCS,并且写得很糟糕(摘自我不久前发布的一个grread getcorner示例)。
顺便说一句,李干得好。
 

(defun c:Test (/)
(sssetfirst nil (_GrSelectionSetShaded (getpoint "\nSpecify first corner: ") '((0 . "LINE"))))
(princ)
)


(defun _GrSelectionSetShaded (pt flt / *error* _solid foo space sort gr solid opt ss)
;; Alan J. Thomspon, 10.18.10

(defun *error* (m) (redraw) (and solid (setq solid (vla-delete solid))))

(or *AcadDoc* (setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))

(setq space (if (or (eq acmodelspace (vla-get-activespace *AcadDoc*))
                     (eq :vlax-true (vla-get-mspace *AcadDoc*))
               )
               (vla-get-modelspace *AcadDoc*)
               (vla-get-paperspace *AcadDoc*)
             )
)

(setq sort (vla-AddObject (vla-GetExtensionDictionary space) "ACAD_SORTENTS" "AcDbSortentsTable"))

(defun _solid (a b c d color)
   (and solid (setq solid (vla-delete solid)))
   (vl-catch-all-apply
   (function
       (lambda (/)
         (vlax-invoke
         sort
         'MoveToBottom
         (list (setq solid (vlax-ename->vla-object
                               (entmakex (list '(0 . "SOLID")
                                             '(100 . "AcDbTrace")
                                             (cons 62 color)
                                             (cons 10 a)
                                             (cons 11 b)
                                             (cons 12 d)
                                             (cons 13 c)
                                       )
                               )
                           )
               )
         )
         )
       )
   )
   )
)

(defun foo (p1 p2)
   (redraw)
   (if (apply 'and (mapcar 'vl-consp (list p1 p2)))
   ((lambda (l d)
      (apply '_solid
               (reverse (cons (setq opt (if (zerop d)
                                          (getvar 'windowareacolor)
                                          (getvar 'crossingareacolor)
                                        )
                              )
                              (cdr (reverse l))
                        )
               )
      )

      (mapcar '(lambda (a b) (and a b (grdraw a b 7 d))) l (append (cdr l) (list (last l))))
      )
       (list p1 (list (car p2) (cadr p1)) p2 (list (car p1) (cadr p2)) p1)
       (cond ((> (car p1) (car p2)) 1)
             (0)
       )
   )
   )
)
(if (vl-consp pt)
   (progn (princ "\rSpecify opposite corner: ")
          (while (eq 5 (car (setq gr (grread T 15 1)))) (foo pt (cadr gr)))
          (redraw)
          (cond ((eq 3 (car gr))
               (setq ss (ssget (if (eq opt (getvar 'windowareacolor))
                                 "_W"
                                 "_C"
                                 )
                                 pt
                                 (cadr gr)
                                 flt
                        )
               )
                )
          )
   )
)
(*error* nil)
ss
)
页: [1] 2
查看完整版本: 如何突出封闭区域