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

#2661 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 22 August 2015 - 12:49 PM

Không biết bạn đã xử lý được chưa?

* Theo mình kiểm tra thì thấy có một số biến bạn khử sớm quá (Xác định biến cục bộ và biến toàn cục), giải quyết vấn đề này là OK.

 

Hôm qua cũng nghi nghi cái biến ,Giờ em sửa được rồi a .Bỏ 2 thằng này (objatt objblk ) ở hàm( TS:STK)  là được ạ :)

Giờ đang cải tiến thêm để xử lý một số điều kiện cho Text chon nữa ^^

Anh Check giúp em còn trường hợp nào bị lỗi nữa không ạ.

Em cảm ơn..!


  • 0

#2662 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 24 August 2015 - 04:13 PM

Anh chị cho em hỏi cách Add  1 text vào Block Attribute đã có với ạ,

Hoặc có thể code cho em 1 đoạn tham khảo cũng được

Em cảm ơn,


  • 0

#2663 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 03 September 2015 - 03:12 PM

Mình viết tkt có đoạn như sau

Mục đích nhập vào 1 số hoặc biểu thức và thu về kết quả nhưng vì lisp bị giới hạn gì đó mà số lớn hơn giới hạn nào đó thì nó sẽ ra kết quả sai. Bác nào có cách khắc phục dể hiểu thì hướng dẩn mình phát. Cám ơn!

 

(defun c:nbt ()
(command "cal" "1+2")
(setq giatrim (getstring "Nhap bieu thuc: "))
(setq giatrim (rtos (C:cal giatrim) 2 0))
(princ giatrim))

  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#2664 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 03 September 2015 - 03:58 PM

 

Mình viết tkt có đoạn như sau

Mục đích nhập vào 1 số hoặc biểu thức và thu về kết quả nhưng vì lisp bị giới hạn gì đó mà số lớn hơn giới hạn nào đó thì nó sẽ ra kết quả sai. Bác nào có cách khắc phục dể hiểu thì hướng dẩn mình phát. Cám ơn!

 

(defun c:nbt ()
(command "cal" "1+2")
(setq giatrim (getstring "Nhap bieu thuc: "))
(setq giatrim (rtos (C:cal giatrim) 2 0))
(princ giatrim))

 

 

Anh tham khảo nhé!

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


  • 1

#2665 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 03 September 2015 - 10:41 PM

 

Mình viết tkt có đoạn như sau

Mục đích nhập vào 1 số hoặc biểu thức và thu về kết quả nhưng vì lisp bị giới hạn gì đó mà số lớn hơn giới hạn nào đó thì nó sẽ ra kết quả sai. Bác nào có cách khắc phục dể hiểu thì hướng dẩn mình phát. Cám ơn!

 

(defun c:nbt ()
(command "cal" "1+2")
(setq giatrim (getstring "Nhap bieu thuc: "))
(setq giatrim (rtos (C:cal giatrim) 2 0))
(princ giatrim))

 

Do Cal giới hạn số nguyên nên Lisp bạn nhập số nguyên đủ lớn là kết quả sẽ sai. Do đó nếu nhập 1000000 + 1000000 thì phải nhập 1000000.+1000000. .

Bạn hãy tận dụng tính chất của Filed sẽ giải quyết vấn đề trên :). Thử Lisp này xem sao :

(defun C:CalE (/ ms str obj) (vl-load-com)
(setq ms (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(setq str (getstring "\nNhap bieu thuc CAL dang :  1+2*2+6/2-3 \n"))
(setq obj (vla-AddText ms "xx" (vlax-3d-point '(0 0 0)) 2))
(vla-put-TextString obj (strcat "%<\\AcExpr (" str ")>%"))
(princ (strcat str "=" (vla-get-TextString obj)))
(vla-delete obj) (textscr) (princ))


  • 1

#2666 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 04 September 2015 - 08:38 AM

He he cách củ chuối nhất là nối thêm cái chuổi cần tính với "+0." giải quyết xong trong mức độ duy cần. Cám ơn hai bạn.

(defun c:nbt ()
(command "cal" "1+2")
(setq giatrim (getstring "Nhap bieu thuc: "))
(setq giatrim (strcat giatrim "+0."))
(setq giatrim (rtos (C:cal giatrim) 2 0))
(princ giatrim))

  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#2667 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 04 September 2015 - 09:46 AM

 

Do Cal giới hạn số nguyên nên Lisp bạn nhập số nguyên đủ lớn là kết quả sẽ sai. Do đó nếu nhập 1000000 + 1000000 thì phải nhập 1000000.+1000000. .

Bạn hãy tận dụng tính chất của Filed sẽ giải quyết vấn đề trên :). Thử Lisp này xem sao :

(defun C:CalE (/ ms str obj) (vl-load-com)
(setq ms (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(setq str (getstring "\nNhap bieu thuc CAL dang :  1+2*2+6/2-3 \n"))
(setq obj (vla-AddText ms "xx" (vlax-3d-point '(0 0 0)) 2))
(vla-put-TextString obj (strcat "%<\\AcExpr (" str ")>%"))
(princ (strcat str "=" (vla-get-TextString obj)))
(vla-delete obj) (textscr) (princ))

 

 

 

He he cách củ chuối nhất là nối thêm cái chuổi cần tính với "+0." giải quyết xong trong mức độ duy cần. Cám ơn hai bạn.

(defun c:nbt ()
(command "cal" "1+2")
(setq giatrim (getstring "Nhap bieu thuc: "))
(setq giatrim (strcat giatrim "+0."))
(setq giatrim (rtos (C:cal giatrim) 2 0))
(princ giatrim))

Giới hạn của số nguyên là từ -2,147,483,648 => 2,147,483,647

Vì vậy nếu kết quả trung gian là số nguyên nằm ngoài giới hạn trên kết quả sẽ sai.

VD: Cách của cả 2 bạn đều không tính được 1000000*10000

Cách của Tue_NV trong link trên tuy giải quyết các trường hợp này nhưng lúc dùng có nhiều vấn đề đã bàn trong topic đó.

Tốt nhất là trong biểu thức nhập, thay vì số nguyên thì nhập thêm dấu chấm động ở các vị trí thích hợp


  • 1

#2668 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 04 September 2015 - 09:49 AM

Hẹ hẹ thế mới nói là mức độ duy cần. Dùng trong thống kê thép thôi chắc ko mấy khi đến số lớn như thế. Cách hoàn mỹ thì hóng thôi.


  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#2669 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 04 September 2015 - 12:46 PM

Hẹ hẹ thế mới nói là mức độ duy cần. Dùng trong thống kê thép thôi chắc ko mấy khi đến số lớn như thế. Cách hoàn mỹ thì hóng thôi.

Không nên cầu toàn bạn ah :) , thêm dấu chấm động ở các vị trí thích hợp khi cần tính số lớn là đươc. Giáo sư tiến sĩ ở VN mà toàn làm quan không thì mãi mãi dân tộc này cũng vẫn là dân trí thấp :D


  • 0

#2670 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 04 September 2015 - 01:43 PM

Thì thế. Thật ra mình cũng nghỉ ra cách là tách các chuổi ngăn cách bởi + - * / rồi kiểm tra các chuổi con có dấu chấm chưa nếu chưa thì thêm dấu chấm vào nhưng lười nên thế là ok rồi.


  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#2671 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 10 September 2015 - 06:31 AM

Nhờ cao thủ viết giúp mình thuật toán cho yêu cầu sau:

Có 1 đường Pline gồm n đỉnh, giờ mình muốn chuyến tọa độ của các đỉnh của đường pline về n tọa độ bất kỳ (đã biết). Chúy ý vẫn giữ nguên đối tượng là đường pline, thao tác lisp chỉ là cập nhật lại tọa độ dỉnh đường pline theo tọa độ mới chứ không phải tạo ra đường pline mới từ n tọa độ (đa biết) đó!


  • -2

#2672 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 10 September 2015 - 08:50 AM

Nhờ cao thủ viết giúp mình thuật toán cho yêu cầu sau:

Có 1 đường Pline gồm n đỉnh, giờ mình muốn chuyến tọa độ của các đỉnh của đường pline về n tọa độ bất kỳ (đã biết). Chúy ý vẫn giữ nguên đối tượng là đường pline, thao tác lisp chỉ là cập nhật lại tọa độ dỉnh đường pline theo tọa độ mới chứ không phải tạo ra đường pline mới từ n tọa độ (đa biết) đó!

 

Em cũng muốn thử sức mình Code xem thế nào nhưng hình dung mãi không ra ^^

 

Tốt nhất anh nên đính kèm file minh họa ,đường pline nó ra sao ,kín hay hở,rồi tọa độ n đỉnh của anh lấy từ đâu(từ file txt hay excel hay cad).

Ngoài ra,có sắp xếp theo thứ tự chi ko? .Chứ em sợ lấy "râu ông nọ cắm cằm bà kia " lắm ^^

 

Thân ái!


  • 0

#2673 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 10 September 2015 - 09:15 AM

Mình đưa bản vẽ mẫu lên bạn xem giúp nhé.

https://drive.google...iew?usp=sharing


  • -1

#2674 Tr.CongSon

Tr.CongSon

    biết lệnh array

  • Members
  • PipPipPip
  • 183 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 10 September 2015 - 10:21 AM

Mình đưa bản vẽ mẫu lên bạn xem giúp nhé.

 

 

Em đã xem và thấy bế tắc toàn tập ^^

Các tọa độ "đã biết" của anh ở đây là biên dạng (dưới) của Block -> mà Lấy tọa độ cái này ngoài tầm với của e ^^

Thôi thì a chờ các cao thủ khác ra tay giúp vậy  .

Cái này em bó tay ^^

 

P/s: Em nghĩ a "kéo" nút xanh xanh của Pline đó về vị trí cần thì nhanh hơn là dùng lisp nhiều ^^ Vì khi dùng lisp ,kiểu chi rồi anh cũng phải pick từng điểm để chỉ định cho nó thôi ^^


  • 0

#2675 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 10 September 2015 - 11:51 AM

Em đã xem và thấy bế tắc toàn tập ^^

Các tọa độ "đã biết" của anh ở đây là biên dạng (dưới) của Block -> mà Lấy tọa độ cái này ngoài tầm với của e ^^

Thôi thì a chờ các cao thủ khác ra tay giúp vậy  .

Cái này em bó tay ^^

 

P/s: Em nghĩ a "kéo" nút xanh xanh của Pline đó về vị trí cần thì nhanh hơn là dùng lisp nhiều ^^ Vì khi dùng lisp ,kiểu chi rồi anh cũng phải pick từng điểm để chỉ định cho nó thôi ^^

 

1./ Tất nhiên dùng Lisp sẽ nhanh hơn rất nhiều rồi ^_^

2./ Nếu Đường màu xanh Pline luôn vẽ đúng theo số đỉnh (9 đỉnh) và rãnh luôn vẽ đúng với Block Ranh BT như quy luật trong bản vẽ thì hoàn toàn có thể dùng Lisp để tự động chỉ định đỉnh cho nó


  • 0

#2676 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 10 September 2015 - 11:52 AM

Vì nhiều trắc ngang voi nhiều km đường nên mới dùng lisp chứ. Việc lấy toạ độ đế cập nhật cho đường pline thi không khó. Có cao thủ nào xem chỉ giúp mình sớm với!!!
  • 0

#2677 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 10 September 2015 - 12:04 PM

Tue có thể viết cho mình thuật toán cập nhật toạ độ đường pline theo toạ độ mới được không. Mình cũng biết đôi chút về lisp nên các bước tiếp theo mình sẽ thử làm ntn.
  • 0

#2678 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 10 September 2015 - 01:58 PM

Tue có thể viết cho mình thuật toán cập nhật toạ độ đường pline theo toạ độ mới được không. Mình cũng biết đôi chút về lisp nên các bước tiếp theo mình sẽ thử làm ntn.

 

Đơn giản là subst + entmod ename thôi bạn ạ!


  • 0

#2679 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 10 September 2015 - 02:06 PM

Bạn có thể viết cụ thể ra với trường hợp tổng quát giúp mình được không. Hoặc cho mình một ví dụ cụ thể để tham khảo với.
  • 0

#2680 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 10 September 2015 - 02:31 PM

Bạn có thể viết cụ thể ra với trường hợp tổng quát giúp mình được không. Hoặc cho mình một ví dụ cụ thể để tham khảo với.

 

Ví dụ: 

Update các đỉnh Pline (dịch đi 1 khoảng) X=1.0 Y=1.0

(defun c:uppl(e ent lst-dinh-res lst-dinh-des)
  (setq e (car(entsel "\nChon PLINE :")))
  (setq ent (entget e))
  (setq lst-dinh-res (vl-remove-if-not '(lambda(x) (= (car x) 10)) ent))
  (setq lst-dinh-des (mapcar '(lambda(x) (list (car x) (+ (cadr x) 1.0) (+ (caddr x) 1.0) 0.0)) lst-dinh-res))
  (mapcar '(lambda(x y) (setq ent (subst x y ent)))  lst-dinh-des lst-dinh-res)
  (entmod ent)
)

  • 0