whosa 发表于 2022-7-5 16:24:38

分割矩形

你好
 
我想用lisp把一个矩形分成相等的小矩形。
 
应该像这样工作:
 
第一次单击:选择矩形
 
第二次点击:询问分区数
 
在lisp之后,应在原始矩形内绘制小矩形,并删除原始矩形
 
 
谢谢

Dadgad 发表于 2022-7-5 16:30:45

我无法帮助您使用lisp,但我相信,您需要指定沿每个轴的分割数。

whosa 发表于 2022-7-5 16:39:03


 
也许这有帮助。

Grrr 发表于 2022-7-5 16:41:24

这个怎么样?

whosa 发表于 2022-7-5 16:48:54

谢谢,这工作得很好,但在使用它之前,我需要每次将ucs更改为object。

Dadgad 发表于 2022-7-5 16:54:08

 
在李的网站上,它说它适用于所有UCS/视图。
我怀疑您可能误解了必须将UCS重置为OBject。
 
您知道,您也可以在没有预先存在的矩形或其他几何体的情况下运行它吗?

whosa 发表于 2022-7-5 16:59:48

这是真的。该lisp将网格与当前Ucs正交
 
有一个问题。例如:您有30个具有不同方向/旋转的矩形要分割。需要在每个矩形中设置ucs对象,然后使用DGrid/DGrid lisp。这意味着要键入30次:
 
ucs->对象->拾取矩形->DGrid,然后再次ucs->对象->拾取矩形->DGrid等。。。。

Dadgad 发表于 2022-7-5 17:07:58

现在我明白你的意思了,你需要重置后续矩形的UCS,这些矩形不在同一UCS中。
这更有道理。

whosa 发表于 2022-7-5 17:11:34

我修复了UCS问题。。。。现在,我可以在绘制网格之前选择UCS,然后返回到最后一个UCS。也许这种代码格式不太好,但效果很好。我对lisp代码的了解有限。
 
 
现在我想:
 
1、只需拆除电网外线
 
 
我不明白我该怎么办
 
 
 
 
 
;;-----------------------=={ Draw Grid }==--------------------;;
;;                                                            ;;
;;Dynamically generates a grid with a specified number of   ;;
;;rows and columns.                                       ;;
;;Works in all UCS/Views.                                 ;;
;;------------------------------------------------------------;;
;;Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;Version 1.1    -    13-10-2011                            ;;
;;------------------------------------------------------------;;

(defun c:dgridnil(command "_.ucs" "_ob" pause) (LM:grid nil)(command "_.ucs" "_p"));; Standard
(defun c:dgridd nil(command "_.ucs" "_ob" pause) (LM:grid   t)(command "_.ucs" "_p"));; Dynamic

;;------------------------------------------------------------;;

(defun LM:grid

   (dyn / *error*_getIntwithDefault _getosmode _parsepoint _makegrid _grX g1 gr ls ms os p1 p3 st )

   (defun *error* ( msg )
       (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
         (princ (strcat "\nError: " msg))
       )
       (redraw) (princ)
   )

   (defun _getIntwithDefault ( msg sym ) (initget 6)

       (set sym
         (cond
               (
                   (getint
                     (strcat msg "<"
                           (itoa
                               (set sym
                                 (cond ((eval sym)) ( 2 ))
                               )
                           )
                           ">: "
                     )
                   )
               )
               (   (eval sym)   )
         )
       )
   )

   (defun _getosmode ( os / lst )
       (foreach mode
          '(
               (0001 . "_end")
               (0002 . "_mid")
               (0004 . "_cen")
               (0008 . "_nod")
               (0016 . "_qua")
               (0032 . "_int")
               (0064 . "_ins")
               (0128 . "_per")
               (0256 . "_tan")
               (0512 . "_nea")
               (1024 . "_qui")
               (2048 . "_app")
               (4096 . "_ext")
               (8192 . "_par")
         )
         (if (not (zerop (logand (car mode) os)))
               (setq lst (cons "," (cons (cdr mode) lst)))
         )
       )
       (apply 'strcat (cdr lst))
   )

   (defun _parsepoint ( pt str / _str->lst lst )

       (defun _str->lst ( str / pos )
         (if (setq pos (vl-string-position 44 str))
               (cons (substr str 1 pos) (_str->lst (substr str (+ pos 2))))
               (list str)
         )
       )

       (if (wcmatch str "`@*")
         (setq str (substr str 2))
         (setq pt '(0.0 0.0 0.0))
       )         

       (if
         (and
               (setq lst (mapcar 'distof (_str->lst str)))
               (vl-every 'numberp lst)
               (< 1 (length lst) 4)
         )
         (mapcar '+ pt lst)
       )
   )

   (defun _makegrid ( p1 p3 mode / hd vd hs vs pt )
       (setq hd (- (carp3) (carp1))
             vd (- (cadr p3) (cadr p1))
             hs (/ hd *cols*)
             vs (/ vd *rows*)
       )
       (cond
         (   (= 5 mode)
               (setq pt p1)
               (repeat (1+ *cols*)
                   (grdraw pt (list (car pt) (+ (cadr pt) vd)) 1 1)
                   (setq pt (list (+ (car pt) hs) (cadr pt)))
               )
               (setq pt p1)
               (repeat (1+ *rows*)
                   (grdraw pt (list (+ (car pt) hd) (cadr pt)) 1 1)
                   (setq pt (list (car pt) (+ (cadr pt) vs)))
               )
               t
         )
         (   (= 3 mode)
               (setq pt p1)
               (repeat (1+ *cols*)
                   (entmakex
                     (list
                           (cons 0 "LINE")
                           (cons 10 (trans pt 1 0))
                           (cons 11 (trans (list (car pt) (+ (cadr pt) vd)) 1 0))
                     )
                   )
                   (setq pt (list (+ (car pt) hs) (cadr pt)))
               )
               (setq pt p1)
               (repeat (1+ *rows*)
                   (entmakex
                     (list
                           (cons 0 "LINE")
                           (cons 10 (trans pt 1 0))
                           (cons 11 (trans (list (+ (car pt) hd) (cadr pt)) 1 0))
                     )
                   )
                   (setq pt (list (car pt) (+ (cadr pt) vs)))
               )
               nil
         )
       )
   )

   (defun _grX ( p s c / -s r q )
       (setq -s (- s)
            r (/ (getvar 'VIEWSIZE) (cadr (getvar 'SCREENSIZE)))
            p (trans p 1 3)
       )
       (grvecs
         (list c
               (list -s      -s)(list s       s)
               (list -s(1+ -s)) (list (1- s)s)
               (list (1+ -s) -s)(list s   (1- s))
               
               (list -s       s)(list s      -s)
               (list -s   (1- s)) (list (1- s) -s)
               (list (1+ -s)s)(list s(1+ -s))
         )
         (list
               (list r0. 0. (carp))
               (list 0. r0. (cadr p))
               (list 0. 0. r0.)
               (list 0. 0. 0. 1.)
         )
       )
       p
   )
   
   (_getIntwithDefault "\nSpecify Number of Rows "    '*rows*)
   (_getIntwithDefault "\nSpecify Number of Columns " '*cols*)

   (if (setq p1 (getpoint "\nSpecify Base Point: "))
       (cond
         (   dyn
               (setq os (_getosmode (getvar 'OSMODE))
                     st ""
               )
               (princ (setq ms "\nSpecify Opposite Corner: "))
               (while
                   (progn (setq gr (grread t 15 0) g1 (car gr) p3 (cadr gr))
                     (cond
                           (   (member g1 '(3 5)) (redraw)
                               (if
                                 (and
                                       (zerop (logand 16384 (getvar 'OSMODE)))
                                       (setq op (osnap p3 os))
                                 )
                                 (_grX (setq p3 op) 6 20)
                               )
                               (_makegrid p1 p3 g1)
                           )
                           (   (= g1 2)
                               (cond
                                 (   (= 6 p3)
                                       (if (zerop (logand 16384 (setvar 'OSMODE (boole 6 16384 (getvar 'OSMODE)))))
                                           (princ (strcat "\n<Osnap on>"ms st))
                                           (princ (strcat "\n<Osnap off>" ms st))
                                       )                                    
                                 )
                                 (   (= 8 p3)
                                       (if (< 0 (strlen st))
                                           (progn
                                             (princ (vl-list->string '(8 32 ))
                                             (setq st (substr st 1 (1- (strlen st))))
                                           )
                                       )
                                       t
                                 )
                                 (   (< 32 p3 127)
                                       (setq st (strcat st (princ (chr p3))))
                                 )
                                 (   (member p3 '(13 32))
                                       (if (< 0 (strlen st))
                                           (if (setq p3 (_parsepoint p1 st))
                                             (_makegrid p1 p3 3)
                                             (princ (strcat (setq st "") "\n2D / 3D Point Required." ms))
                                           )
                                       )
                                 )
                               )
                           )
                     )
                   )
               )
         )
         (   (setq p3 ((if (zerop (getvar 'WORLDUCS)) getpoint getcorner) p1 "\nSpecify Opposite Corner: "))
               (_makegrid p1 p3 3)
         )               
       )
   )
   (redraw) (princ)
)
(vl-load-com) (princ)

;;------------------------------------------------------------;;
;;                         End of File                        ;;
;;------------------------------------------------------------;;

marko_ribar 发表于 2022-7-5 17:14:39

将(_makegrid)子函数替换为:
 

   (defun _makegrid ( p1 p3 mode / hd vd hs vs pt k )
       (setq hd (- (carp3) (carp1))
             vd (- (cadr p3) (cadr p1))
             hs (/ hd *cols*)
             vs (/ vd *rows*)
       )
       (cond
         (   (= 5 mode)
               (setq pt p1)
               (repeat (1+ *cols*)
                   (grdraw pt (list (car pt) (+ (cadr pt) vd)) 1 1)
                   (setq pt (list (+ (car pt) hs) (cadr pt)))
               )
               (setq pt p1)
               (repeat (1+ *rows*)
                   (grdraw pt (list (+ (car pt) hd) (cadr pt)) 1 1)
                   (setq pt (list (car pt) (+ (cadr pt) vs)))
               )
               t
         )
         (   (= 3 mode)
               (setq pt p1)
               (setq k 0)
                (repeat (1+ *cols*)
                  (setq k (1+ k))
                   (if (or (/= k 1) (/= k (1+ *cols*)))
                        (entmakex
                           (list
                               (cons 0 "LINE")
                               (cons 10 (trans pt 1 0))
                               (cons 11 (trans (list (car pt) (+ (cadr pt) vd)) 1 0))
                           )
                     )
                  )
                  (setq pt (list (+ (car pt) hs) (cadr pt)))
               )
               (setq pt p1)
                (setq k 0)
                (repeat (1+ *rows*)
                  (setq k (1+ k))
                   (if (or (/= k 1) (/= k (1+ *rows*)))
                     (entmakex
                           (list
                               (cons 0 "LINE")
                               (cons 10 (trans pt 1 0))
                               (cons 11 (trans (list (+ (car pt) hd) (cadr pt)) 1 0))
                           )
                     )
                   )
                   (setq pt (list (car pt) (+ (cadr pt) vs)))
               )
               nil
         )
       )
   )
页: [1] 2
查看完整版本: 分割矩形