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

Nhờ viết lisp convert arc thành pline có 2 đầu là 2 đoạn thẳng

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

Mình đang rất gấp, mình xin phép được nhờ các ae trong forum viết hoặc lên ý tưởng hộ mình vấn đề sau:

Mình có các arc rời rạc, cần 1 lisp chuyển (hoặc tạo) arc đó thành 1 pline, trong đó có 2 đầu là 2 đoạn thẳng, ở giữa là arc, độ dài 2 đoạn thẳng cho mình chỉ định (ví dụ 1,2,3 gì đấy, lấy bằng hàm getPointatDist gì gì đó, để ra 1 cái điểm cách 2 mút chính xác 1 khoảng như đã chỉ định, bán kính của arc mới chính bằng arc cũ.

Phiền các bạn giúp đỡ mình nhé, mình 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

@Duong Nhat Duy

 

2 giờ trước, Duong Nhat Duy đã nói:

Mình đang rất gấp, mình xin phép được nhờ các ae trong forum viết hoặc lên ý tưởng hộ mình vấn đề sau:

Mình có các arc rời rạc, cần 1 lisp chuyển (hoặc tạo) arc đó thành 1 pline, trong đó có 2 đầu là 2 đoạn thẳng, ở giữa là arc, độ dài 2 đoạn thẳng cho mình chỉ định (ví dụ 1,2,3 gì đấy, lấy bằng hàm getPointatDist gì gì đó, để ra 1 cái điểm cách 2 mút chính xác 1 khoảng như đã chỉ định, bán kính của arc mới chính bằng arc cũ.

Phiền các bạn giúp đỡ mình nhé, mình xin cảm ơn !

 

chữa cháy nhé, không biết có đúng ý hay không. CHú ý dòng lệnh command, mình chạy trên acad2007 không bị áo lỗi

Vòng lập và tham số chiều dài Bạn viết thêm vào nhé

 

(defun c:alp (/ ANGE ANGS APE APS E1 E2 EN EP L PE PS SP SS);arc + line => polyline
  (setq	en   (car (entsel "\nChon arc: "))
	ep   (vlax-curve-getEndPoint en)
	sp   (vlax-curve-getStartPoint en)
	l    (vlax-curve-getDistAtPoint en ep)
	ps   (vlax-curve-getPointAtDist en 1e-8)
	pe   (vlax-curve-getPointAtDist en (- l 1e-8))
	aps  (angle ps sp)
	ape  (angle pe ep)
	angs (angle '(0 0)
		    (Vlax-curve-getfirstderiv
		      en
		      (vlax-curve-getParamAtPoint en sp)
		    ) ;_ end of Vlax-curve-getfirstderiv
	     ) ;_ end of angle
	ange (angle '(0 0)
		    (Vlax-curve-getfirstderiv
		      en
		      (vlax-curve-getParamAtPoint en ep)
		    ) ;_ end of Vlax-curve-getfirstderiv
	     ) ;_ end of angle
  ) ;_ end of setq
  (if (< 1. (abs (- ape ange)))
    (setq ange (+ ange pi))
    ange
  ) ;_ end of if
  (if (< 1. (abs (- aps angs)))
    (setq angs (+ angs pi))
    angs
  ) ;_ end of if
  (setq	e1 (entmakex (list '(0 . "LINE")
			   (cons 10 sp)
			   (cons 11 (polar sp angs 5))
		     ) ;_ end of list
	   ) ;_ end of entmakex
  ) ;_ end of setq
  (setq	e2 (entmakex (list '(0 . "LINE")
			   (cons 10 ep)
			   (cons 11 (polar ep ange 5))
		     ) ;_ end of list
	   ) ;_ end of entmakex
  ) ;_ end of setq
  (setq ss (ssadd))
  (ssadd en ss)
  (ssadd e1 ss)
  (ssadd e2 ss)
  (command ".pedit" "m" ss "" "y" "j" 0 "")
  (princ)
)

 

  • Like 1
  • 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
4 giờ trước, Duong Nhat Duy đã nói:

Mình đang rất gấp, mình xin phép được nhờ các ae trong forum viết hoặc lên ý tưởng hộ mình vấn đề sau:

Mình có các arc rời rạc, cần 1 lisp chuyển (hoặc tạo) arc đó thành 1 pline, trong đó có 2 đầu là 2 đoạn thẳng, ở giữa là arc, độ dài 2 đoạn thẳng cho mình chỉ định (ví dụ 1,2,3 gì đấy, lấy bằng hàm getPointatDist gì gì đó, để ra 1 cái điểm cách 2 mút chính xác 1 khoảng như đã chỉ định, bán kính của arc mới chính bằng arc cũ.

Phiền các bạn giúp đỡ mình nhé, mình xin cảm ơn !

Mình viết cho bạn 1 hàm convert nè theo kiểu cổ điển thôi

sừ dụng như sau

(cvarc  (car(entsel)) 5)

 

 


 

 (defun cvarc(en l / eg c r sa ea el p1 p2 bu)
  (setq eg (entget en))
  (mapcar '(lambda(a b) (set a (cdr(assoc b eg)))) '(c r sa ea) '(10 40 50 51))
  (setq el (last c)
    c (list (car c) (cadr c))
    p1 (polar c sa r)
    p2 (polar c ea r)
    bu (- ea sa)
    bu (/ (If (> bu 0) bu (+ pi pi bu)) 4)
    bu (/ (sin bu) (cos bu)))
    
  (entdel en)
  (entmakex (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 0)

          (cons 38 el) ; Dat cao do
          (cons 10 (polar p1 (- sa (/ pi 2)) l))
          (cons 10 p1)
          (cons 42 bu)
          (cons 10 p2)
          (cons 10 (polar p2 (+ ea (/ pi 2)) l))

          (assoc 210 eg)))) ; Dat he truc toa do

  • 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
Đăng nhập để thực hiện theo  

×