Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
đặng phụng

LISP đối xứng đối tượng

Các bài được khuyến nghị

nhờ các ace trên diễn đàn giúp mình 1 lisp đối xứng đối tượng chọn, giống như dùng lệnh Mirro chọn yes vậy

-gõ lệnh

-chọn đối tượng đối xứng

-chọn điểm đối xứng

-kết thúc

cảm ơn các anh em nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
3 giờ trước, đặng phụng cho biết:

nhờ các ace trên diễn đàn giúp mình 1 lisp đối xứng đối tượng chọn, giống như dùng lệnh Mirro chọn yes vậy

-gõ lệnh

-chọn đối tượng đối xứng

-chọn điểm đối xứng

-kết thúc

cảm ơn các anh em nhiều.

Quá khó cho 1 yêu cầu????

Phải có thêm 1 phương nữa mới làm được

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

mình muốn đối xứng mũi tên có ghi chú  text  cho nhanh í mà, dùng lệnh mirro cũng được thôi nhưng phải bấm chọn thêm lựa chọn yes rồi bấm enter nữa nhiều thao tác khi vẽ quá. Bạn giỏi về lisp giúp mình và mọi người trên diễn đàn với, mình nghỉ có rất nhiều người cần lisp này khi vẽ đấy.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình cũng đang cần yêu cầu tương tự thế này. Tuy nhiên muốn phát triển ý tưởng thêm một chút dùng cho hàng loạt:

- Chọn hàng loạt đối tượng

- chọn phương (bằng cách pick đường thẳng hoặc 2 điểm)

- lisp tự mirror các đối tượng, lấy tâm là tâm của từng đối tượng riêng đó với phương là mình đã chọn ở trên.

 

Mục đích là lật hàng loạt các đối tượng theo phương mình chọn nhưng các đối tượng đó vẫn tương đối ở nguyên vị trí đó, tâm của các đối tượng con đó không thay đổi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 1/10/2017 tại 11:52, Doan Van Ha đã nói:

Nè vua làm biếng!

 


	(defun C:MR()
 (command "mirror" (ssget) "" (setq p (getpoint "\nPick point: ")) (list (+ (car p) 1.0) (cadr p)) "y") (princ))
	

 

 

Vào lúc 1/10/2017 tại 20:00, Danh Cong đã nói:

Tìm chỗ mà thay (list (car p) (+ (cadr p) 1.0))

 

Nhờ các bác phát triển ý tưởng của lisp này thêm được không, mình tìm trên mạng cả tuần nay rồi nhưng chưa tìm được lisp nào như thế này được cả.

- Chọn hàng loạt đối tượng

- chọn phương (bằng cách pick đường thẳng hoặc 2 điểm)

- lisp tự mirror các đối tượng, lấy tâm là tâm của từng đối tượng riêng đó với phương là mình đã chọn ở trên.

 

Mục đích là lật hàng loạt các đối tượng theo phương mình chọn nhưng các đối tượng đó vẫn tương đối ở nguyên vị trí đó, tâm của các đối tượng con đó không thay đổi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình nghĩ nó cũng tương tự lisp Scale tại tâm này.

Tuy nhiên mình dốt lisp quá nên không biết sửa kiểu gì. Nhờ các cao nhân giúp đỡ.

 

 

(defun C:SAC (/ *error* cmde ss inc ent)
  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nError: " errmsg))
    ); end if
    (command "_.undo" "_end")
    (setvar 'cmdecho cmde)
    (princ)
  ); end defun - *error*
  (setq cmde (getvar 'cmdecho))
  (setvar 'cmdecho 0)
  (command "_.undo" "_begin")
  (setq *SACscl
    (cond
      ( (getreal
          (strcat
            "\nEnter Scale Factor <"
            (if *SACscl (rtos *SACscl 2 4) "1"); offer default: prior value / 1 on first use
            ">: "
          ); strcat
        ); getreal
      ); User-input condition
      (*SACscl); Enter on subsequent use [prior value]
      (1); Enter on first use
    ); cond & *SACscl
    ss (ssget ":L" '((-4 . "<NOT") (0 . "RAY,XLINE") (-4 . "NOT>")))
      ;; not objects on Locked Layers or without finite extents
  ); setq
  (repeat (setq inc (sslength ss))
    (setq ent (ssname ss (setq inc (1- inc))))
    (vla-getboundingbox (vlax-ename->vla-object ent) 'minpt 'maxpt)
    (command
      ".scale" ent "" "_none"
      (mapcar '/ ; midpoint of bounding box
        (mapcar '+ (vlax-safearray->list minpt) (vlax-safearray->list maxpt))
        '(2 2 2)
      ); mapcar
      *SACscl
    ); command
  ); repeat
  (command "_.undo" "_end")
  (setvar 'cmdecho cmde)
  (princ)
); defun
(vl-load-com)
(prompt "\nType SAC to Scale objects About each one's Center.")

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
(defun C:MIRRORCENTER (/ *error* cmde osmode ss inc ent minpt maxpt center axis point2)
  ;; Ham xu ly loi
  (defun *error* (errmsg)
    (if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break"))
      (princ (strcat "\nLoi: " errmsg))
    )
    (command-s "_.undo" "_end") ; Ket thuc undo
    (setvar 'cmdecho cmde)      ; Khoi phuc trang thai cmdecho
    (setvar 'osmode osmode)     ; Khoi phuc trang thai osnap
    (princ)
  )
  
  ;; Luu gia tri ban dau cua cmdecho va osnap
  (setq cmde (getvar 'cmdecho))
  (setq osmode (getvar 'osmode)) ; Luu trang thai osnap hien tai
  (setvar 'cmdecho 0)
  (setvar 'osmode 0) ; Tat che do truy bat diem de tranh loi
  
  ;; Bat dau undo
  (command-s "_.undo" "_begin")

  ;; Yeu cau nguoi dung chon truc phan chieu
  (setq axis (getstring "\nNhap truc phan chieu (X/Y): "))
  (setq axis (strcase axis)) ; Chuyen ve chu in hoa de so sanh

  ;; Kiem tra xem nguoi dung co chon truc hop le khong
  (if (not (member axis '("X" "Y")))
    (progn
      (princ "\nTruc khong hop le. Hay nhap X hoac Y.")
      (command-s "_.undo" "_end")
      (setvar 'cmdecho cmde)
      (setvar 'osmode osmode)
      (princ)
      (exit)
    )
  )

  ;; Loc doi tuong, khong chon cac doi tuong bi khoa
  (setq ss (ssget ":L" '((-4 . "<NOT") (0 . "RAY,XLINE") (-4 . "NOT>"))))

  (if ss ; Kiem tra neu tap hop doi tuong khong rong
    (progn
      ;; Lap qua cac doi tuong trong tap hop duoc chon
      (repeat (setq inc (sslength ss))
        (setq ent (ssname ss (setq inc (1- inc)))) ; Lay tung doi tuong
        (vla-getboundingbox (vlax-ename->vla-object ent) 'minpt 'maxpt) ; Lay bounding box
        (setq center ; Tinh tam cua bounding box
          (mapcar '/ 
            (mapcar '+ (vlax-safearray->list minpt) (vlax-safearray->list maxpt))
            '(2 2 2)
          )
        )
        ;; Tao diem thu hai dua tren truc phan chieu
        (setq point2
          (cond
            ((equal axis "X") ; Truc X: dich chuyen nhe theo X
             (list (+ (car center) 0.1) (cadr center) (caddr center))
            )
            ((equal axis "Y") ; Truc Y: dich chuyen nhe theo Y
             (list (car center) (+ (cadr center) 0.1) (caddr center))
            )
          )
        )

        ;; Thuc hien lenh mirror qua tam
        (command-s
          "_.mirror" ent "" 
          center ; Diem dau tien (tam)
          point2 ; Diem thu hai
          "_N" ; Khong giu lai ban goc
        )
      )
      ;; Hoan tat lenh
      (princ "\nPhan chieu doi xung qua tam da hoan tat.")
    )
    (progn
      (princ "\nKhong co doi tuong hop le duoc chon.")
    )
  )

  ;; Ket thuc undo va khoi phuc trang thai ban dau
  (command-s "_.undo" "_end")
  (setvar 'cmdecho cmde)
  (setvar 'osmode osmode) ; Khoi phuc osnap
  (princ) ; Ket thuc lenh luon
)
(vl-load-com)
(prompt "\nGoi MIRRORCENTER de phan chieu doi xung qua tam.")

Sau một hồi loay hoay với con AI thì nó cũng viết được đoạn này đáp ứng yêu cầu Mirror đối tượng qua tâm theo yêu cầu của bạn. Tuy có thấy cái đoạn osnap nó cứ kỳ kỳ mà ko biết lisp nên để vậy :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×