Chuyển đến nội dung
Diễn đàn CADViet
hoacomay70

[ Yêu cầu ] Nhờ viết lisp vẽ đường thẳng vuông góc với Pline

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

Em làm đường nên rất hay phải tính đặt cọc tiêu, biển báo với lý trình xác định, mỗi lần làm như vậy đều mất công đo khoảng cách theo tim tuyến là đường Pline rất mất công để đảm báo tính chính xác, nên em nhờ các anh chị có thể viết cho em lisp để làm cho đơn giản hơn.:

- Có đường Pline là đường tim tuyến cho sẵn và một đường thẳng vuông góc xác định vị trí cho trước. Khi chọn hai đường này, và nhập khoảng cách theo đường Pline, cad sẽ tự động vẽ ra đường thẳng vuông góc với Pline.

Em xin cảm ơn.

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

Measure Block hoặc Arrray Path vớiCAD 2012 trở đi  :)

Bác ơi em cảm ơn bác rất nhiều. Bác cho em hỏi thêm chút cách dùng lệnh Array Path, em chỉ muốn vẽ một đường thẳng, lệnh nó lại rải cả đường Pline em chọn, em phải phá ra rồi lại xóa đi hơi mất công, em mò mãi vẫn chưa ra cách, bác chỉ giúp em được không?

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

Bạn diễn đạt hơi khó hiểu. Có thể trên 1 file Cad đi.

Bác ơi nó gần giống lệnh array một đường thẳng vuông góc với một đường Pline cho trước theo đường Pline ấy với khoảng cách xác định, mà em array nó toàn rải cả đường Pline của em, em chỉ muốn nó ra một đối tượng thôi, mà đối tượng này cũng vuông góc với Pilne 

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

nếu bác offset đường pline ra 1 khoảng rồi extent cái cọc tim ra liệu có đc k?

Là sao hở bác, em không hiểu? Bác giải thích rõ hơn cho em được không?

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 là đường tim tuyến b có, giờ b đưa vào cell để chèn các cọc (muốn chèn biển báo), rồi đưa lại tệp NTD, xuất ra cọc tại các vị trí đó, vậy là bạn có cái mình cần. K biết có đúng ý b k?

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

Có mỗi file cad để thể hiện ý tưởng mà cũng không có thì chịu thôi.

Chắc em chưa biết cách diễn đat. Em có một đường Pline và một đường thẳng vuông góc với đường Pline đó, và một giá trị khoảng cách cho trước. Em muốn vẽ một đường thẳng mới : vuông góc với đường Pline, khoảng cách giữa chân hai đường vuông góc theo Pline là giá trị khỏa125447_cad1_1.pngng cách cho trước trên. Em xin cảm ơn

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

Array Path đường thẳng cho trước theo Pline, chọn dãy array, bật bảng thuộc tính lên (Ctrl+1) -> Chỉnh Method là Measure, Fill Entire Path về No, chọn số lượng là 2, chỉnh khoảng cách mong muốn ở Item Spacing

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

Chắc em chưa biết cách diễn đat. Em có một đường Pline và một đường thẳng vuông góc với đường Pline đó, và một giá trị khoảng cách cho trước. Em muốn vẽ một đường thẳng mới : vuông góc với đường Pline, khoảng cách giữa chân hai đường vuông góc theo Pline là giá trị khỏa125447_cad1_1.pngng cách cho trước trên. Em xin cảm ơn

Mình có cái này để vẽ được đường vuông góc với đối tượng mẫu là Line, bạn có thể nhờ các bác sửa giúp để có thể dùng được cả với Pline!  (oh, nhầm không nhìn kỹ hình  :) )

(defun c:Per (/ #Obj #Point #Ang)
   (and (setq #Obj (entsel "\nSelect line: "))
        (eq "LINE" (cdr (assoc 0 (entget (car #Obj)))))
        (or (setq #Point (getpoint "\nSpecify first point <At Selection>: "))
            (setq #Point (vlax-curve-GetClosestPointTo (car #Obj) (cadr #Obj)))
        ) ;_ or
        (setq #Ang (angtos (+ (* 0.5 pi) (vla-get-angle (vlax-ename->vla-object (car #Obj)))) 0 4))
        (vl-cmdf "_.line" "_non" #Point (strcat "<" #Ang) PAUSE "")
   ) ;_ and
   (princ)
 ) ;_ defun 

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

Cái này số lượng ít k sao, nhiều hơi mệt
Bạn lợi dụng tính năng xuất tuyến nova để làm nếu số liệu tim tuyến bạn đã có ( R,Lct, alpha...)

K có thì thủ công vậy. thân

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

Đúng là bài toán giao thông. Xác định một điểm theo lý trình (khoảng cách) đây mà.

Mình không dùng lisp vì Land or Civil có sẵn.

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

Thử file này, bạn sau khi chon pline va đường thẳng thì phải chỉ điểm cuối của pline để ct biết rải về phía nào.http://www.cadviet.com/upfiles/3/127168_tmp1_10.lsp

Cảm ơn bác rất nhiều, lisp hay quá lun, mà bác ơi bác có thể chỉnh giúp em để em có thể nhập vào số lượng đường cẩn rải không ạ?

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

Của bạn đây.

 

 

(defun c:test(/ cd pl obj dd dait cl sl 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)
dd (getpoint "\nDiem cuoi cua Polyline:")
cd (getreal "\nNhap buoc de rai:")
obj (vlax-ename->vla-object pl) 
dg (vlax-curve-getClosestPointTo obj (acet-dxf 10 (entget li)))
sl (getint "\nSo luong coc rai")
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)
)
  • Vote tăng 1

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

Của bạn đây.

 

 

(defun c:test(/ cd pl obj dd dait cl sl 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)
dd (getpoint "\nDiem cuoi cua Polyline:")
cd (getreal "\nNhap buoc de rai:")
obj (vlax-ename->vla-object pl) 
dg (vlax-curve-getClosestPointTo obj (acet-dxf 10 (entget li)))
sl (getint "\nSo luong coc rai")
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)
)

Cảm ơn bác nhiều lắm ạ, :D lisp hay wwoa' lun

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

 

Của bạn đây.

 

 

(defun c:test(/ cd pl obj dd dait cl sl 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)
dd (getpoint "\nDiem cuoi cua Polyline:")
cd (getreal "\nNhap buoc de rai:")
obj (vlax-ename->vla-object pl) 
dg (vlax-curve-getClosestPointTo obj (acet-dxf 10 (entget li)))
sl (getint "\nSo luong coc rai")
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)
)

Bác ơi lips rất hay nhưng bác giúp em chỉnh sửa lại 1 tí được ko ạ:

- bác cho thêm lựa chọn chọn 1lúc nhiều đối tượng chứ ko chỉ 1 đối tượng

- đến chỗ lựa chọn theo em nghĩ nếu đã có bước rải thì thôi lựa chọn số cọc cần rải. Tuy nhiên em thấy lips bắt nhập cả nếu ko nhập sẽ bị lỗi. Chỗ này bác cho độc lập thì hay vẫn sẽ hỏi như vậy nhưng nếu muốn nhập số cọc cần rải thì ko nhập vào bước cần rải.

 

Thanks bác 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

Lisp trên là theo yêu cầu của hoacomay70 cho nên nó vẽ (chứ không phải copy) đường vuông góc, do đó chỉ chọn 1 line để lấy điểm đầu, và nhập số cọc rải để hạn chế số lần rải, nếu không sẽ rải tới cuối đường pline.

Còn nếu bạn chọn nhiều đt tức là bạn muốn copy, rải và xoay theo hướng vuông góc với pline thì dùng cái lisp dưới đây.

 

(defun c:test(/ cd pl obj dd dait cl sl n os ki )  
  (defun thgoc (ent pt / param)
    (if (setq param (vlax-curve-getParamAtPoint ent pt))
      (- (angle '(0 0 0) (vlax-curve-getFirstDeriv ent param)) (/ pi 2))
      nil)
  )
  
  (setq pl (car (entsel "\nChon Polyline:")))
  (prompt "\nChon doi tuong can rai:")
  (setq ss (ssget)
        dd (getpoint "\nDiem bat dau rai (nam tren Polyline) :")
        dc (getpoint "\nDiem cuoi cung rai (nam tren Polyline) :")
        cd (getreal "\nNhap buoc rai:")
sl (fix (/ (- (vlax-curve-getDistAtPoint pl dc) (vlax-curve-getDistAtPoint pl dd)) cd))
        os (getvar "OSMODE"))  
 
 (setvar "OSMODE" 0)
 (repeat sl
   (setq el (entlast)
ang (thgoc pl dd))
   (command "copy" ss "" dd (setq dd1 (vlax-curve-getPointAtDist pl (+ cd (vlax-curve-getDistAtPoint pl dd)))))
   (setq ss (ssadd)
dd dd1
ang1 (thgoc pl dd))
   (while (setq en (entnext el))
      (ssadd en ss)
      (setq el en))
   (command "rotate" ss "" dd "r" dd (polar dd ang 1) (polar dd ang1 1))
 )  
 (setvar "OSMODE" os)
 (princ)
)
  • Vote tăng 1

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

×