Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

nhoclangbat    382

- hi là cái lsp tính diện tích bình thường nhoc mot đc trên 4rum, đem về chỉnh sữa lại tí phù hợp với yêu cầu của nhoc, hồi đó có hỏi anh Ket góp ý

1- set thêm tỉ lệ => đã chỉnh đc

2- lsp gốc tính = lệnh bo, nhưng nhoc mún nó tính đc kiểu vùng trong vùng, chỉ tính vùng ngoài ko tính vùng trong, anh ket gợi ý dùng hatch sẽ loại đc vùng trong => chỉnh đc

- Nhưng a Ket nói nhìn cái code ngán quá ^^, mog rằng học hết khóa nhoc sẽ viết lại cho nó gọn gàng ngắn đẹp hơn, nên rãnh nhoc mò thư nhưng chắc chưa đc rùi ^^, lsp nhoc để máy công ty rùi, mai nhoc up thử, nếu đc mí anh giúp cho lsp nhoc nó ngắn gọn xúc tích hơn ^^

p/s: giờ nhoc 25t mog cỡ 30t đc cỡ 1/2 anh Ket là mừng rù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
thanhduan2407    226

Các bác, các anh cho em hỏi 1 chút.

Em có 1 Polyline, 1 điểm (Điểm A) nằm ngoài Polyline đó và 1 góc (góc trong Autocad, góc Beta).

Các anh các bác tư vấn cho em cách tìm giao điểm gần nhất tính từ điểm A theo hướng góc Beta tới Polyline đó.

Theo cách em suy nghĩ thì là tìm điểm nào nằm trên Polyline nằm trên đường thẳng đi qua điểm A với hướng góc Beta đó. Tính khoảng cách điểm trên Pline tới điểm A, khoảng cách nào ngắn nhất là điểm cần tìm.

Em chưa biết cách thức viết code nên nhờ các bác tư vấn.

Em cảm ơn 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
Doan Van Ha    2.676

Hướng đi của em là đúng rồi đó.

1). Vẽ 1 Xline tạm đi qua A và theo góc Beta.

2). Tìm tất cả giao điểm của Xline và Polyline.

3). Sort để tìm được điểm gần nhất.

4). Xóa Xline.

Code tìm các giao điểm của 2 entity:


;; Get intersection of entity1 and entity2, by flag (flags: acExtendNone ; acExtendThisEntity ; acExtendOtherEntity ; acExtendBoth).
(defun #Inter:2Ent(ent1 ent2 flag / l r)
 (setq l (vlax-invoke (vlax-ename->vla-object ent1) 'intersectwith (vlax-ename->vla-object ent2) flag))
 (repeat (/ (length l) 3)
  (setq r (cons (list (car l) (cadr l) (caddr l)) r) l (cdddr l)))
 (reverse r))
 

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
thanhduan2407    226

 

Gửi vào Hôm nay, 09:28 AM

Hướng đi của em là đúng rồi đó.

1). Vẽ 1 Xline tạm đi qua A và theo góc Beta.

2). Tìm tất cả giao điểm của Xline và Polyline.

3). Sort để tìm được điểm gần nhất.

4). Xóa Xline.

Code tìm các giao điểm của 2 entity:

Em cảm ơn bác Hạ đã tư vấn cho em. 

Như vậy vẫn là Make Xline ạ?

Xline lại có 2 đầu, như vậy sẽ có nhiều giá trị và phải lọc theo hướng lần nữa.

Trước mắt là em làm như vậy đã.

Em cảm ơn bác Hạ 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
Tue_NV    3.841

Em cảm ơn bác Hạ đã tư vấn cho em. 

Như vậy vẫn là Make Xline ạ?

Xline lại có 2 đầu, như vậy sẽ có nhiều giá trị và phải lọc theo hướng lần nữa.

Trước mắt là em làm như vậy đã.

Em cảm ơn bác Hạ nhiều

 

Xline là đường thẳng dài vô hạn, làm gì có 2 đầu em?

Do nó dài vô hạn, đâu có phải lọc theo hướng lần nữa?

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
thanhduan2407    226

Xline là đường thẳng dài vô hạn, làm gì có 2 đầu em?

Do nó dài vô hạn, đâu có phải lọc theo hướng lần nữa?

À, ý em là nó có 2 hướng. Hiii.

Như vậy em giải quyết được vấn đề rồ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
thanhduan2407    226

Các anh cho em hỏi về hàm Entmake Xline với ạ!

(defun MakeXline (pt vec)
  (entmakex (list (cons 0 "XLINE")
                  (cons 100 "AcDbEntity")
                  (cons 100 "AcDbXline")
                  (cons 10 pt)
                  (cons 11 vec)
	    )
  )
)

Vec là phần tử gì ạ? Em muốn vẽ Xline đi qua 2 điểm (1 điểm gốc xoay và điểm bất kỳ) thì như thế nào ạ?

Em cảm ơn 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
thanhduan2407    226

À mà em giải quyết được rồi ạ!

(defun C:00 ( /  )
(setq ObjPline1 (car (entsel "\nChon Pline can tim diem giao cat gan nhat: ")))
(setq ObjPoint (car (entsel "\nChon diem can tim giao ")))
(setq P1 (acet-dxf 10 (entget ObjPoint)))
(setq Pnt (getpoint "\nChon huong: "))
(setq  P2 (mapcar '- Pnt P1))
(MakeXline P1 P2)
(setq EnameXline (entlast))
)

(defun MakeXline (pt vec)
  (entmakex (list (cons 0 "XLINE")
                  (cons 100 "AcDbEntity")
                  (cons 100 "AcDbXline")
                  (cons 10 pt)
                  (cons 11 vec)
	    )
  )
)

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
Doan Van Ha    2.676

Có cảm giác là với Thanhduan2407 thì "hỏi" bao giờ cũng tốt hơn "tự tìm hiểu"  ^_^

Nhiều lần cứ thấy "cho em hỏi ạ?" rồi chỉ ít phút sau thì "em đã tìm ra rồ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
thanhduan2407    226

Có cảm giác là với Thanhduan2407 thì "hỏi" bao giờ cũng tốt hơn "tự tìm hiểu"   ^_^

Nhiều lần cứ thấy "cho em hỏi ạ?" rồi chỉ ít phút sau thì "em đã tìm ra rồi ạ!"

Hì hì. Em dịch tài liệu nước ngoài nên tìm được ạ. ^^

Lần sau em rút kinh nghiệm

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
tien2005    97

- ngắn gọn hơn (setq EnameXline (MakeXline P1 P2))

- (setq ObjPoint (car (entsel "\nChon diem can tim giao ")))
(setq P1 (acet-dxf 10 (entget ObjPoint)))

<=> (setq P1 (getpoint "\nChon diem can tim giao "))

 

- Pnt ở đâu ra 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
hiepttr    523

Lại nhiều chuyện tí ^^

 

Đã gọi là hướng thì gốm phương + chiều

===> tại sao ko dùng RAY thay cho XLINE để khỏi lọc "đầu này _ đầu kia" ???

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
Doan Van Ha    2.676

Lại nhiều chuyện tí ^^

 

Đã gọi là hướng thì gốm phương + chiều

===> tại sao ko dùng RAY thay cho XLINE để khỏi lọc "đầu này _ đầu kia" ???

1). Ý của chủ topic: là phương, nhưng ghi là hướng thôi.

2). Đã nói ở trên là dùng LINE cho dễ rồ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
thanhduan2407    226

Em viết trải Taluy giữa 2 đường các anh ạ.

Em viết xong rồi. Chỉ nhờ trợ giúp 1 chút và tự làm thôi ạ

(defun C:VTL2 (  / Olmode Sovachngan  *Sovachngan* CDVN *CDVN*  CDDoan ObjPline1 ObjPL2 ObjPline2 VlaObjPline1 CDaiPLine1 VlaObjPline2
		   n d1 d2 LtsEnameLD LtsEnameLN Lts1 Lts2 LtsPntNgan   PntInObjPline2 PntInObjPline3 ang_1 ang_2 P3
	       )
(MakeLayer_ "TALUYN" 1)
(MakeLayer_ "TALUYD" 7)
(defun *error* ( msg )
(if Olmode (setvar 'osmode Olmode))
(if (not (member msg '("*BREAK,*CANCEL*,*EXIT*")))
    (princ (strcat "\nError: " msg))
)
(princ)
)
(setq Olmode (getvar "OSMODE"))
(setq Sovachngan 1)
(or *CDVN* (setq *CDVN* 2.5))
(setq CDVN (getreal (strcat "\nNh\U+1EADp kho\U+1EA3ng c\U+00E1ch gi\U+1EEFa c\U+00E1c v\U+1EA1ch: < "
			  (rtos *CDVN* 2 2)
			 " > :"
		    )
	 )
)
(if (not CDVN) (setq CDVN *CDVN*) (setq *CDVN* CDVN))
(setq CDDoan (* (+ Sovachngan 1) CDVN ))


  
(setq ObjPline1 (car (entsel "\nChon duong thu nhat: ")))
(setq ObjPL2  (entsel "\nChon duong thu hai: "))
(setq ObjPline2 (car ObjPL2))

(setq VlaObjPline1 (vlax-ename->vla-object ObjPline1))
(setq CDaiPLine1 (vla-get-length VlaObjPline1))


(setq VlaObjPline2 (vlax-ename->vla-object ObjPline2))
  
(setq n (fix (/ CDaiPLine1 CDDoan)))
(setq d1 0)
(setq Lts1 (list))
(setq LtsEnameLD (list))
(setq LtsEnameLN (list))
(while (< d1 CDaiPLine1)
	(progn
		(setq Ptd (vlax-curve-getPointAtDist VlaObjPline1 d1))
		(setq d1 (+ d1 CDDoan))
	  	(setq ang_1 (angle '(0 0) (Vlax-curve-getfirstderiv VlaObjPline1 (vlax-curve-getParamAtPoint VlaObjPline1 Ptd))))
	  	(if (setq PntInObjPline2 (TDKDGN Ptd ObjPline2 (polar Ptd (+ ang_1 (/ pi 2) ) CDVN)))
		    (progn
	  	    	(entmake (list (cons 0 "LINE") (cons 8 "TALUYD") (cons 10  Ptd) (cons 11 PntInObjPline2)))
	  	    	(setq EnameLD (entlast))
	  		(setq LtsEnameLD (append LtsEnameLD (list EnameLD)))
	  		(setq Lts1 (append Lts1 (list Ptd)))
		    )
		)
	)
)
(setq d2 0)
(setq Lts2 (list))
(setq m (fix (/ CDaiPLine1 CDVN)))
(while (< d2 CDaiPLine1)
	(progn
		(setq Ptn_N (vlax-curve-getPointAtDist VlaObjPline1 d2))
		(setq d2 (+ d2 CDVN))
	  	(setq Lts2 (append Lts2 (list Ptn_N)))
	)
)
(setq LtsPntNgan (LM:ListDifference Lts2 Lts1))
(foreach Pnt1 LtsPntNgan
  	(setq ang_2 (angle '(0 0) (Vlax-curve-getfirstderiv VlaObjPline1 (vlax-curve-getParamAtPoint VlaObjPline1 Pnt1))))
  	(if (setq PntInObjPline3 (TDKDGN Pnt1 ObjPline2 (polar Pnt1 (+ ang_2 (/ pi 2) ) CDVN)))
	    (progn
	  	(setq P3 (list (/ (+ (car Pnt1) (car PntInObjPline3)) 2) (/ (+ (cadr Pnt1) (cadr PntInObjPline3)) 2)))
	  	(entmake (list (cons 0 "LINE") (cons 10  Pnt1) (cons 8 "TALUYN") (cons 11 P3)))
	    )
	)
)
(princ)
)

(defun MakeLayer_ ( name colour /)
    (if (null (tblsearch "LAYER" name))
        (entmake
            (list
               '(0 . "LAYER")
               '(100 . "AcDbSymbolTableRecord")
               '(100 . "AcDbLayerTableRecord")
               '(70 . 0)
                (cons 2 name)
                (cons 62 colour)
            )
        )
    )
)

(defun LM:ListDifference ( l1 l2 )
  (if l1
    (if (member (car l1) l2)
      (LM:ListDifference (cdr l1) l2)
      (cons (car l1) (LM:ListDifference (cdr l1) l2))
    )
  )
)

(defun LM:Intersections ( obj1 obj2 mode / l r )
    (setq l (vlax-invoke obj1 'intersectwith obj2 mode))
    (repeat (/ (length l) 3)
        (setq r (cons (list (car l) (cadr l) (caddr l)) r)
              l (cdddr l)
        )
    )
    (reverse r)
)

(defun MakeXline (pt vec)
  (entmakex (list (cons 0 "XLINE")
                  (cons 100 "AcDbEntity")
                  (cons 100 "AcDbXline")
                  (cons 10 pt)
                  (cons 11 vec)
	    )
  )
)

(defun TDKDGN (P1 ObjPline1 Pnt / Vla:ObjPline1   EnameXline Vla:Xline LtsPnt ) ;;;TIM DIEM KEO DAI GAN NHAT
(setq Vla:ObjPline1 (vlax-ename->vla-object ObjPline1))
(setq P2 (mapcar '- Pnt P1))
(MakeXline P1 P2)
(setq EnameXline (entlast))
(setq Vla:Xline (vlax-ename->vla-object EnameXline))
(setq LtsPnt (LM:Intersections Vla:ObjPline1  Vla:Xline acextendboth))
(entdel EnameXline)
(setq PntNear (car (vl-sort LtsPnt '(lambda(x y) (< (distance x P1) (distance y P1))))))
PntNear
)

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ào các bạn. Mình đang tìm hiểu giải thuật tính toán diện tích đào đất, đắp đất, đào khuôn… giống như chương trình thiết kế đường Nova mà chưa có ý tưởng gì. Có bạn nào từng làm qua chỉ giúp với. 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
Tot77    501

Chào các bạn. Mình đang tìm hiểu giải thuật tính toán diện tích đào đất, đắp đất, đào khuôn giống như chương trình thiết kế đường Nova mà chưa có ý tưởng gì. Có bạn nào từng làm qua chỉ giúp với. Cảm ơn.

Bạn phải nói rõ bạn đã có cái gì ( giả thiết) và cần có những gì ( kết luận) thì mới suy ra giải thuật dc chứ.

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 ơn bạn đã quan tâm. Mình nghiên cứu phương pháp tính diện tích cắt ngang trong Nova và rút ra vài ý sau:

-       Nova sử dụng Xdata để thao tác các đối tượng

-       Cách lập diện tích căn cứ vào giao đường đen và đường thiết kế (tất nhiên). Nhưng làm sao để xác định được khối lượng đào và đắp (đường nào nằm trên và nằm dưới) thì  Không biết.

Mong các bạn có ý kiến và giải pháp giúp tiếp. 

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


×