Đế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
2851 replies to this topic

#2361 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

Đã gửi 05 January 2015 - 10:24 PM

Command -dimstyle và lựa chọn Save

P/s Bác Tuệ : giống mà bác, k phải bằng ^^

Cảm ơn Ketxu nhé! 


  • 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







#2362 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 06 January 2015 - 06:27 AM

 
Việc so sánh không nên sử dụng với hàm member. Có những TH tuy là bằng nhau nhưng có sự sai số
Nên sử dụng hàm equal cho chắc chắn.

  

Command -dimstyle và lựa chọn Save
P/s Bác Tuệ : giống mà bác, k phải bằng ^^

Thực ra mục đích của em là loại bỏ những phần tử trùng nhau trong 2 tập hợp text và đường thẳng giống lệnh overkill. Text thì đơn giản rồi còn đường thẳng đang gặp chút khó khăn nếu như chiều dài của chúng không băngd nhau. Em đã cố gắng đơn giản hoá vấn đề nhất để nhờ mọi người tư vấn và còn để cho não nó vận động cho khỏi teo :D
  • 0

#2363 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

Đã gửi 06 January 2015 - 07:04 AM

  Thực ra mục đích của em là loại bỏ những phần tử trùng nhau trong 2 tập hợp text và đường thẳng giống lệnh overkill. Text thì đơn giản rồi còn đường thẳng đang gặp chút khó khăn nếu như chiều dài của chúng không băngd nhau. Em đã cố gắng đơn giản hoá vấn đề nhất để nhờ mọi người tư vấn và còn để cho não nó vận động cho khỏi teo :D

Ném nó vào 1 danh sách rồi so sánh lọc loại bỏ.


  • 1



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







#2364 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 January 2015 - 07:11 AM

  Thực ra mục đích của em là loại bỏ những phần tử trùng nhau trong 2 tập hợp text và đường thẳng giống lệnh overkill. Text thì đơn giản rồi còn đường thẳng đang gặp chút khó khăn nếu như chiều dài của chúng không băngd nhau. Em đã cố gắng đơn giản hoá vấn đề nhất để nhờ mọi người tư vấn và còn để cho não nó vận động cho khỏi teo :D

 

Giờ là không bằng nhau chứ không phải là giống nhau nữa rồi!

Nên sử dụng đoạn code có sử dụng hàm equal hơn là đoạn code có sử dụng hàm member!


  • 1

#2365 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 06 January 2015 - 07:38 AM

Tiện đây cho em hỏi thêm về hàm loại bỏ của bác thanhduan247 ở trên với, kiểu lặp hàm con trong hàm con như thế thì gọi là lặp kiểu gì, em cũng vẫn còn rất mơ hồ về vấn đề này để tự áp dụng cho bản thân.

(defun LM:_UniqueFuzz ( l fz )
    (if l
      (cons (car l)
        (LM:_UniqueFuzz
          (vl-remove-if '(lambda ( x ) (equal x (car l)  fz)) (cdr l)) fz
        )
      )
    )
)

  • 0

#2366 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 January 2015 - 07:43 AM

Tiện đây cho em hỏi thêm về hàm loại bỏ của bác thanhduan247 ở trên với, kiểu lặp hàm con trong hàm con như thế thì gọi là lặp kiểu gì, em cũng vẫn còn rất mơ hồ về vấn đề này để tự áp dụng cho bản thân.

(defun LM:_UniqueFuzz ( l fz )
    (if l
      (cons (car l)
        (LM:_UniqueFuzz
          (vl-remove-if '(lambda ( x ) (equal x (car l)  fz)) (cdr l)) fz
        )
      )
    )
)

 

Đó là thuật toán đệ quy bạn ạ. "Một đối tượng được gọi là đệ quy nếu nó được mô tả thông qua định nghĩa của chính nó."


  • 1

#2367 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 06 January 2015 - 08:00 AM

Thanks bác Tue_NV, quay lại vấn đề đoạn thẳng trùng nhau (nằm đè lên nhau), em mới chỉ nghĩ ra được điều kiện để kiểm tra như sau:

-Tính chiều dài các đoạn thẳng

- Sắp xếp theo thứ tự chiều dài nhỏ dần trong list bằng vl-sort

-Dùng hàm của bác thanhduan247 ở trên để kiểm tra điều kiện:

Chiều dài đoạn thẳng lớn hơn = [tổng khoảng cách của các đầu đoạn thẳng lớn đến các đầu đoạn thẳng nhỏ

                                                                                                                       hoặc đến các đầu của (reverse của đoạn thẳng nhỏ)]

                                                     + với chiều dài đoạn thẳng nhỏ

                                                                                                                      kèm sai số.

Mong các bác chỉ giáo thêm133631_untitled_1.jpg


  • 0

#2368 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 06 January 2015 - 08:14 AM

- mục đích sâu xa là Hieu mún giữ thằng nào bỏ thằng nào ^^


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2369 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 06 January 2015 - 08:28 AM

- mục đích sâu xa là Hieu mún giữ thằng nào bỏ thằng nào ^^

Giữ lớn bỏ nhỏ nhoclangbat ạ


  • 0

#2370 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 January 2015 - 09:48 AM

Giữ lớn bỏ nhỏ nhoclangbat ạ

 

Bạn theo dõi các bài viết từ bài #1826

http://www.cadviet.c...-coding/page-92


  • 1

#2371 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 06 January 2015 - 09:56 AM

Thanks bác Tue_NV


  • 0

#2372 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

Đã gửi 07 January 2015 - 07:21 AM

Các bác cho em hỏi về entmod Polyline.

Em muốn thay đổi danh sách tọa độ đỉnh mới cho 1 polyline mà vẫn giữ nguyên các thuộc tính polyline đó thì hàm sẽ ntn ạ?

Entmod 2DPolyline và Entmod 3DPolyline có khác nhau nhiều lắm ko ạ?

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







#2373 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 07 January 2015 - 08:11 AM

- hi trong bài nhoc đc học của anh Ket, có viết hàm entmod với trường hợp là polyline, ko biết có giúp  đc gì cho anh Duan ko, còn vụ 3dpolyline nhoc chưa mò tới ^^

(foreach x lst_new
			(if (= (car x) 10) (setq lstcu (subst x (assoc 10 lstcu) lstcu)) (setq lstcu (append lstcu (list x)))))

- lst_new là danh sách tọa độ mới, lst_cu là là danh sách khi entget polyline 


  • 1
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2374 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

Đã gửi 07 January 2015 - 08:30 AM

- hi trong bài nhoc đc học của anh Ket, có viết hàm entmod với trường hợp là polyline, ko biết có giúp  đc gì cho anh Duan ko, còn vụ 3dpolyline nhoc chưa mò tới ^^

(foreach x lst_new
			(if (= (car x) 10) (setq lstcu (subst x (assoc 10 lstcu) lstcu)) (setq lstcu (append lstcu (list x)))))

- lst_new là danh sách tọa độ mới, lst_cu là là danh sách khi entget polyline 

Cảm ơn em nhé! ^^

Anh test đã. ^^


  • 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







#2375 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

Đã gửi 07 January 2015 - 09:05 AM

Nhoclangbat xem lại giúp anh nhé!

(foreach x lst_new
			(if (= (car x) 10) (setq lstcu (subst x (assoc 10 lstcu) lstcu)) (setq lstcu (append lstcu (list x)))))

Cấu trúc này ko ổn.

Em đưa lên cả đoạn để anh xem đi.

lst_new là list tọa độ => (car x) = Tọa độ X, đâu bằng 10


  • 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







#2376 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 07 January 2015 - 11:57 AM

- hi sr anh nhoc lộn, nhoc mot của sư huynh Hiep, chưa đọc kỹ , chỉ entmod đc điểm đầu or cả lstdxf10 ^^

(defun k_entmod (ten lst_new / lstcu)
(setq lstcu (entget ten))
(cond
	((= (cdr (assoc 0 lstcu)) "MTEXT")
		(foreach x lst_new
			(if (= (car x) 1) (setq lstcu (subst x (assoc 1 lstcu) lstcu)) (setq lstcu (append lstcu (list x))))))
	((= (cdr (assoc 0 lstcu)) "*POLYLINE")
		(foreach x lst_new
			(if (= (car x) 10) (setq lstcu (subst x (assoc 10 lstcu) lstcu)) (setq lstcu (append lstcu (list x)))))
					)
	
	(t (setq lstcu (append lstcu lst_new)))
)
(entmod lstcu)
)

  • 1
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2377 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 07 January 2015 - 12:11 PM


Thanks bác Tue_NV, quay lại vấn đề đoạn thẳng trùng nhau (nằm đè lên nhau), em mới chỉ nghĩ ra được điều kiện để kiểm tra như sau:

-Tính chiều dài các đoạn thẳng

- Sắp xếp theo thứ tự chiều dài nhỏ dần trong list bằng vl-sort

-Dùng hàm của bác thanhduan247 ở trên để kiểm tra điều kiện:

Chiều dài đoạn thẳng lớn hơn = [tổng khoảng cách của các đầu đoạn thẳng lớn đến các đầu đoạn thẳng nhỏ

                                                                                                                       hoặc đến các đầu của (reverse của đoạn thẳng nhỏ)]

                                                     + với chiều dài đoạn thẳng nhỏ

                                                                                                                      kèm sai số.

Nếu chỉ là đoạn thẳng thì mình nghĩ bạn nên làm thế này :

- Đầu vào là tập Line bất kỳ

- Foreach từng Line để nhóm các Line có Angle dxf 10, 11 trùng nhau hoặc chênh nhau 180 độ vào 1 nhóm, theo dạng này :

( (goc1 . (Line1 Line2 Line3 ..)(goc 2 . (Line4 Line5 ...))

- Viết hàm con xử lý đám màu đỏ kia. Cách dễ nhất là giữ thằng to lại, xóa tiệt thằng nhỏ đi. Còn có yêu cầu khác thì bạn xử lý ^^

- Cuối cùng là mapcar

Nếu sử dụng các hàm vl thì code cũng gọn thôi, ít nhất là hơn trước ^^


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#2378 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 January 2015 - 01:29 PM

@Thanhduan: em "lão luyện" trong việc post bài rồi mà cứ post kiểu "Cám ơn. Để test xem sao" hoặc "Thanks" khi nhận được một ý kiến trả lời. Thay vì vậy chỉ cần nhấn like là đủ, để tránh bắt người khác phải đọc 1 nội dung "không có gì".

@Ket:

1). Có những cặp Line có góc bằng nhau nhưng không đè lên nhau?

2). Liệu có thể viết được danh sách gồm các item kiểu (goc . list) không?


  • 2

* 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.


#2379 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5679 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 07 January 2015 - 02:04 PM

@bác :
1. Chính là việc phải xử lý trong hàm con riêng. Việc xếp này giúp hạn chế số lần kiểm tra thôi ạ.
2. Không. Cháu viết dấu . để trinhhoanghieu phân biệt 2 phần tử này. Thực chất được tạo nên bở list list, k cons, nhưng vẫn lấy được assoc như thường, vì nó chính là 1 associative list. Cái này mấy post trước vừa có xong
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#2380 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 07 January 2015 - 04:05 PM

Thanks thầy ketxu và bác gia bạch đã quan tâm  đến vấn đề của em nhiệt tình như vậy. Vì phần xoá line trùng này chỉ là "bộ lọc" cho một cái lisp mà em dùng áp dụng cho công việc, theo sự "chỉ điểm" của bác Tue_NV em "mót" lại hàm con này trên  diễn đàn và chế lại theo nhu cầu:

(defun xoalinetrung (lst / lst1)
(setq lst1 (list (car lst)))
(while lst
	(setq lst (cdr lst)
		x (last lst1))
	(foreach y lst
		(if (and
		      (equal (+ (distance (car x) (car y)) (distance (car y) (cadr x))) (distance (car x) (cadr x)) 0.002)
		      (equal (+ (distance (car x) (cadr y)) (distance (cadr y) (cadr x))) (distance (car x) (cadr x)) 0.002)
		    )
		(setq lst (vl-remove y lst))
		)
	)
	(setq lst1 (append lst1 (list (car lst))))
)
(vl-remove-if '(lambda (x) (= x nil)) lst1)
)

Đầu tiên em áp dụng cho toàn bộ tập đường thẳng đã xoá bỏ lại toàn bộ các mã dxf râu ria và còn lại list là danh sách toạ độ có dạng 

 

 

(  ( (xdau1 ydau1 0) ((xsau1 ysau1 0) )....)
 

 

Thanks bác Tue_NV, quay lại vấn đề đoạn thẳng trùng nhau (nằm đè lên nhau), em mới chỉ nghĩ ra được điều kiện để kiểm tra như sau:

-Tính chiều dài các đoạn thẳng

- Sắp xếp theo thứ tự chiều dài nhỏ dần trong list bằng vl-sort

-Dùng hàm của bác thanhduan247 ở trên để kiểm tra điều kiện:

Chiều dài đoạn thẳng lớn hơn = [tổng khoảng cách của các đầu đoạn thẳng lớn đến các đầu đoạn thẳng nhỏ

                                                                                                                       hoặc đến các đầu của (reverse của đoạn thẳng nhỏ)]

                                                     + với chiều dài đoạn thẳng nhỏ

                                                                                                                      kèm sai số.

Nếu chỉ là đoạn thẳng thì mình nghĩ bạn nên làm thế này :

- Đầu vào là tập Line bất kỳ

- Foreach từng Line để nhóm các Line có Angle dxf 10, 11 trùng nhau hoặc chênh nhau 180 độ vào 1 nhóm, theo dạng này :

( (goc1 . (Line1 Line2 Line3 ..)(goc 2 . (Line4 Line5 ...))

- Viết hàm con xử lý đám màu đỏ kia. Cách dễ nhất là giữ thằng to lại, xóa tiệt thằng nhỏ đi. Còn có yêu cầu khác thì bạn xử lý ^^

- Cuối cùng là mapcar

Nếu sử dụng các hàm vl thì code cũng gọn thôi, ít nhất là hơn trước ^^

Để em áp dụng ý tưởng chia để trị này tăng tốc cho lisp, tuy không giống hoàn toàn nhưng chắc cũng chạy nhanh lên được kha khá :D


  • 0