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

Nhờ các bác sửa giúp lisp vẽ đường thẳng vuông góc với pline

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

Trước bác Tot77 có viết cho em một lisp rất hay như sau:

- chọn một đường pline 1 cho trước

- chọn 1 đường pline 2 ( hoặc line)vuông góc với pline 1 đó

- chọn điểm đầu (hoặc cuối) của pline để xác định hướng rải

- nhâp khoảng cách cần rải và số lượng đường cần rải

Lisp sẽ rải ra các đường pline vuông góc với pline 1 và cách pline 2 khoảng cách người dùng nhập.

Trước em dùng lisp này rất tốt nhưng hiện tại em hay phải thao tác với các đường pline 1 rất dài, bản vẽ nặng, công zoom để chọn được

điểm cuối của pline rất lâu. Em nhờ các bác có thể sửa giúp lisp để không cần phải chọn điểm đầu (hoặc cuối) của pline mà lisp tự động 

vẽ ra 2 đầu của pline đc không ạ.

Em xin cảm ơn.

 

test.lsp

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
14 giờ trước, hoacomay70 đã nói:

Trước bác Tot77 có viết cho em một lisp rất hay như sau:

- chọn một đường pline 1 cho trước

- chọn 1 đường pline 2 ( hoặc line)vuông góc với pline 1 đó

- chọn điểm đầu (hoặc cuối) của pline để xác định hướng rải

- nhâp khoảng cách cần rải và số lượng đường cần rải

Lisp sẽ rải ra các đường pline vuông góc với pline 1 và cách pline 2 khoảng cách người dùng nhập.

Trước em dùng lisp này rất tốt nhưng hiện tại em hay phải thao tác với các đường pline 1 rất dài, bản vẽ nặng, công zoom để chọn được

điểm cuối của pline rất lâu. Em nhờ các bác có thể sửa giúp lisp để không cần phải chọn điểm đầu (hoặc cuối) của pline mà lisp tự động 

vẽ ra 2 đầu của pline đc không ạ.

Em xin cảm ơn.

 

test.lsp

(defun c:test(/ pl obj dd dait cl n os ki )
  (defun ad(v p1 p2 / a1)
    (abs (- (vlax-curve-getDistAtPoint (setq a1 (vlax-ename->vla-object v)) (vlax-curve-getClosestPointTo a1 p2))
  (vlax-curve-getDistAtPoint a1 (vlax-curve-getClosestPointTo a1 p1)))))
  
  (defun getp(v dis)
     (vlax-curve-getPointAtDist (vlax-ename->vla-object v) dis))
  
  (defun thgoc (ent pt / param obj) 
    (if (setq param (vlax-curve-getParamAtPoint (setq obj (vlax-ename->vla-object ent)) pt))
      (- (angle '(0 0 0) (vlax-curve-getFirstDeriv obj param))  (/ pi 2))
      nil))
  
  (defun daitc(v / obj)    
      (vlax-curve-getDistAtParam (setq obj (vlax-ename->vla-object v)) (vlax-curve-getEndParam obj)))
  
  ;;;
  
  (setq pl (car (entsel "\nChon Polyline:"))
li (car (entsel "\nChon duong thang vuong goc voi Polyline:"))
dail (daitc li)
obj (vlax-ename->vla-object pl) 
dg (vlax-curve-getClosestPointTo obj (acet-dxf 10 (entget li)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(if (< (distance dg (vlax-curve-getEndPoint obj)) (distance dg (vlax-curve-getStartPoint obj))) 
(setq dd (vlax-curve-getStartPoint obj))
(setq dd (vlax-curve-getEndPoint obj))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(or (and cd (or (= (type cd) 'int) (= (type cd) 'real))) (setq cd 20.00))
(setq cd (cond ((getreal (strcat "\nNhap buoc de rai <" (rtos cd 2 2) ">:"))) (cd)))
;(setq cd (getreal "\nNhap buoc de rai:"))
;(setq sl (getint "\nSo luong coc rai"))
(or (and sl (or (= (type sl) 'int))) (setq sl (fix (/ (GetDis obj dd dg) cd))))
(setq sl (cond ((getint (strcat "\nNhap buoc de rai <" (rtos sl 2 0) ">:"))) (sl)))
(setq ct (vlax-curve-getDistAtPoint obj dg)
n 0
os (getvar "OSMODE"))
  (if (< (distance dd (vlax-curve-getStartPoint obj)) (distance dd (vlax-curve-getEndPoint obj)))
    (setq ki nil) (setq ki t))
  (setvar "OSMODE" 0)
  (repeat sl         
    (command "line"
    (setq dg1 (if ki (getp pl (+ ct (* (setq n (1+ n)) cd)))
     (getp pl (- ct (* (setq n (1+ n)) cd)))))   
    (polar dg1 (thgoc pl dg1) dail) ""))
  (setvar "OSMODE" os)
  (princ)
)
(defun GetDis (en pt1 pt2 / dis1 dis2 dis)
(setq
dis1 (vlax-curve-getDistAtPoint en (vlax-curve-getClosestPointTo en pt1))
dis2 (vlax-curve-getDistAtPoint en (vlax-curve-getClosestPointTo en pt2))
dis (abs (- dis2 dis1))
)
)

Sửa lại cho bạn nhé. Số lượng có thể nhập nếu không muốn rải hết, còn rải hết thì cứ việc ấn Enter nhé

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  

×