วันพุธที่ 6 พฤษภาคม พ.ศ. 2563

Lisp Request


Lisp Request
ผมต้องการเลือกจุดสองจุดที่วงกลมเล็ก รูปซ้ายมือ
แล้วให้มันสร้างเส้นเซ็นเตอร์ให้เป็นเส้นสีแดงฝั่งขวามือ
รบกวนพี่ๆช่วยเขียนให้หน่อยครับ
(defun c:RECL ()
(setq old_cmdecho  (getvar "cmdecho"))
(setq old_osnap (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 37);; 1+4+32 1=endpoint 4=center 32= intersection
      (setq p1 (getpoint "\nPick Start Point : "))
      (setq p2 (getcorner p1 "\nPick Corner Point : "))
      (setvar "osmode" 0)
      (setq leng (distance p1 p2))
      (setq pc (polar p1 (angle p1 p2) (/ leng 2.0))
              pl (list (-(car pc)(/ leng 2.0))(cadr pc))
              pr (list (+(car pc)(/ leng 2.0))(cadr pc))
              pt (list (car pc)(+(cadr pc)(/ leng 2.0)))
              pb (list (car pc)(-(cadr pc)(/ leng 2.0)))
      )
      (if (null (tblsearch "LType" "center"));if null center line
        (command "_linetype" "load" "center" "acad.lin" "")
    )
      (command "_line" pl pr "")
      (setq ss0 (ssget "L"))
      (command "_line" pt pb "")
      (setq ss1 (ssget "L"))
      (command "_chprop" ss0 ss1 "" "_ltype" "center" "")
(setvar "cmdecho" old_cmdecho)
(setvar "osmode" old_osnap)
(princ)    
)
;;---------------------------------------------------------------------
;; แบบที่ 2 จะเป็นแบบเลือกครอบหัวเสาทีละหลายๆ เสาพร้อมกันทีเดียวเลย
;;---------------------------------------------------------------------
(defun c:SREC ()
(setq old_cmdecho  (getvar "cmdecho"))
(setq old_osnap (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(if (null (tblsearch "LType" "center"));if null center line
    (command "_linetype" "load" "center" "acad.lin" "")
)
(setq ss (ssget (list '(0 . "*POLYLINE"))))
(setq i -1)
(repeat (sslength ss)   
      (setq en (ssname ss (setq i (1+ i))))
      (vla-getboundingbox (vlax-ename->vla-object en) 'll 'ur)
      (setq ll (vlax-safearray->list ll);;low left
          ur (vlax-safearray->list ur);;up right
          pc (polar ll (angle ll ur) (/ (distance ll ur) 2.0))
              pl (list (-(car pc)(/ (distance ll ur) 2.0))(cadr pc))
              pr (list (+(car pc)(/ (distance ll ur) 2.0))(cadr pc))
              pt (list (car pc)(+(cadr pc)(/ (distance ll ur) 2.0)))
              pb (list (car pc)(-(cadr pc)(/ (distance ll ur) 2.0)))
      )
      (command "_line" pl pr "")
      (setq ss0 (ssget "L"))
      (command "_line" pt pb "")
      (setq ss1 (ssget "L"))
      (command "_chprop" ss0 ss1 "" "_ltype" "center" "")
(princ)    
)
(setvar "cmdecho" old_cmdecho)
(setvar "osmode" old_osnap)
(princ)    
)
;;----------------------------------------------------------------
รบกวนพี่ๆอีกครั้งครับ
ผมต้องการ Lisp ให้คลิ๊กที่ จุดที่1 และจุดที่2 แล้วก็ให้โปรแกรมสร้างเส้น line ให้โดยเว้น Gap ให้อัตโนมัติ
ตัวอย่างรูปด้านซ้าย เมื่อเสร็จแล้วจะเป็นรูปแบบด้านขวา
ขั้นตอนการใช้งาน
1.คือใส่ค่า Gap เช่น 15 ก็จะเว้นจากชิ้นงาน 15 ทั้งสองฝั่ง
2.เลือกที่ขอบชิ้นงานทั้ง 2 ฝั่งแล้วสร้างเส้น Line ที่มี Gap 15 ทั้งสองฝั่งให้
(defun c:Lgap ()
(setq old_cmdecho (getvar "cmdecho"))
(setq old_osnap (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 33)
(setq p1 (getpoint "\nPick Start Point : "))
(setq p2 (getpoint p1 "\nPick End Point : "))
(setvar "osmode" 0)
(setq gab 15.0);;Gab Distance
(setq p1a (polar p1 (angle p1 p2) gab)
p2a (polar p2 (angle p2 p1) gab)
)
(command "_line" p1a p2a "")
(setvar "cmdecho" old_cmdecho)
(setvar "osmode" old_osnap)
(princ)

)
;;----------------------------------------------------------------
ตรงค่าที่เว้นอ่าครับผมอยากให้สามารถ ป้อนค่าเข้าไปได้นะครับตรงนี้มันจะเว้นเท่าขนาด สเกลที่ใช้งาน ไม่ได้เว้น 15 ทุกครั้งนะครับ
(defun c:Lgap ()
(setq old_cmdecho (getvar "cmdecho"))
(setq old_osnap (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 33)
(or gab (setq gab 15.0))
(setq gabtemp
(getdist (strcat "\n Enter Gab Distance : <"
(rtos gab 2 2)
">: "
) ;_ strcat
) ;_ getdist
) ;_ setq
(and gabtemp (setq gab gabtemp))
(while (setq p1 (getpoint "\nPick Start Point : "))
(setq p2 (getpoint p1 "\nPick End Point : "))
(setvar "osmode" 0)
;(setq gab 15.0);;Gab Distance
(setq p1a (polar p1 (angle p1 p2) gab)
p2a (polar p2 (angle p2 p1) gab)
)
(command "_line" p1a p2a "")
(setvar "osmode" 33)
);while
(setvar "cmdecho" old_cmdecho)
(setvar "osmode" old_osnap)
(princ)

)