Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2854 replies to this topic

#1881 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 09:03 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1882 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 27 September 2014 - 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:

;; 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))
 


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1883 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 09:40 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1884 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 27 September 2014 - 09:44 AM

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?


  • 0

#1885 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 09:47 AM

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 ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1886 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 27 September 2014 - 09:48 AM

Nếu "sợ" XLINE thì vẽ LINE. Khi đó chú ý flag.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1887 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 10:13 AM

Dạ, em hiểu. Em sẽ chơi Xline. Hii


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1888 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 10:28 AM

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 ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1889 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 10:32 AM

À 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)
	    )
  )
)

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1890 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 27 September 2014 - 10:39 AM

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 ạ!"


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1891 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 10:50 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1892 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 27 September 2014 - 10:54 AM

- 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


  • 0

#1893 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 11:25 AM

Thôi chít, em copy thiếu

(setq Pnt (getpoint "\nChon huong: "))


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1894 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 11:26 AM

Cái em đưa lên chỉ là mẫu ví dụ thôi ạ, nó phục vụ cho bài toán khác ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1895 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 27 September 2014 - 04:08 PM

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" ???


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#1896 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 27 September 2014 - 04:57 PM

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. 


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1897 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 September 2014 - 05:05 PM

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
)

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1898 phuonghuynhduy

phuonghuynhduy

    biết vẽ line

  • Members
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 27 September 2014 - 05:05 PM

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.


  • 0

#1899 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 September 2014 - 05:38 PM

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ứ.
  • 0

#1900 phuonghuynhduy

phuonghuynhduy

    biết vẽ line

  • Members
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 27 September 2014 - 07:45 PM

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. 


  • 0