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

#2481 quansla

quansla

    biết lệnh xclip

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

Đã gửi 07 April 2015 - 08:51 AM

(defun tinhdientichdoituong( ename)
  (vla-get-area (vlax-ename->vla-object ename))
)
Code trên mình trích trên Cadviet, mình chỉ có thể kiểm tra ename có phải là POLYLINE, HATCH ... thôi, nhưng mình nghĩ chỉ biết như vậy chưa đủ. Thật tình đến giờ này mình chưa nắm đc mấu chốt của vl nên hầu như mình bí,

1. Không phải đối tượng nào trong Cad cũng có thể có tham số diện tích: ví dụ: LINE, Text,DIM,...
2. Không phải tham số diện tích nào của đối tượng Cad cũng có thể dùng hàm vla-get-are ... Ví dụ tham số iện tích của Circle
3. Hình như câu hỏi của bạn là câu hỏi tu từ. Hì hì.
để dễ dang trong cách tiếp cận, bạn hãy vào Visual lisp (qua lệnh VLIDE) sau đó gọi lệnh
(if (setq dt (entsel "\nChoi doi tuong can xem thong tin"))
(setq obj (vlax-ename->vla-object (car dt))))


sau đó bôi den obj và nhấn tổ hợp phím CTRL +W để (show Watch - xem đối tượng) đối tượng nhấp đôi vào chữ dt trong cửa sổ hiện lên và tìm hiểu, chúc thành công
  • 1

#2482 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 07 April 2015 - 08:54 AM

 Cái này dùng cũng được.

(if (vlax-property-available-p (setq obj (vlax-ename->vla-object ename)) 'area )
(vla-get-area obj) nil)

  • 1

#2483 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 07 April 2015 - 09:31 AM

Cám ơn các bạn đã chỉ dẫn. Tại vì cái code đó mình để trong trong trình với nhiều thứ khác, nếu lỡ găp trường hợp kg tính được nó báo lỗi rồi ngưng luôn thì CT bị gãy (ví dụ gặp Hatch not associative), do đó mình muốn kiểm tra nếu kg tính dc thi thôi xử lý kiểu khác.

 

Đã kiểm tra code của bác Ha lúc nào cũng trả về nil còn của bác Tot77 thì lỗi khi gặp Hatch not associative


  • 0

#2484 ndtnv

ndtnv

    biết lệnh minsert

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

Đã gửi 07 April 2015 - 10:07 AM

Sửa 1 ít code của Doan Van Ha

(if
(vl-catch-all-error-p (setq area (vl-catch-all-apply 'vla-get-Area (list (vlax-ename->vla-object (car (entsel)))))))
nil
area)


  • 0

#2485 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 07 April 2015 - 10:13 AM

Sửa 1 ít code của Doan Van Ha

(if
(vl-catch-all-error-p (setq area (vl-catch-all-apply 'vla-get-Area (list (vlax-ename->vla-object (car (entsel)))))))
nil
area)

Code này cũng lỗi khi gặp Hatch not associative bác ơi


  • 0

#2486 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 07 April 2015 - 10:45 AM

Code này cũng lỗi khi gặp Hatch not associative bác ơi

Với code trên, lỗi chỉ xảy ra khi user pick trượt đối tượng.


  • 0

#2487 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 07 April 2015 - 11:23 AM

Với code trên, lỗi chỉ xảy ra khi user pick trượt đối tượng.

Xin lỗi các bạn, mình nhầm. Đúng như gia_bach nói. Cám ơn bác

Nhưng code trên chạy khá lâu các bác ạ. Mình chọn 1 đối tượng khá là lớn nhiều point thì sau hơn 1 phút mới có kq. Có code nào chạy nhanh hơn chỉ cần trả về T hay nil kg cần tính kg các bác nhỉ


  • 0

#2488 taybacincc

taybacincc

    biết vẽ circle

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

Đã gửi 09 April 2015 - 11:04 PM

      Em có một bài toán nho nhỏ mong các bác giúp đỡ.

     Bài toán của em như sau: Em có một 2Dpolyline là 1 đường thẳng (chỉ có 2 đỉnh) và có nhiều text có giá trị là XY (XY là giá trị bất kỳ mà mình đã biết từ trước). Bây giờ e muốn chọn 1 text có giá trị XY kia  gần nhất với điểm đầu pline đã có. Có thể lấy khoảng cách từ điểm chèn text tới điểm đầu pline để so sánh khoảng cách cũng được.

     Em cũng thấy có nhiều lisp có đề cập tới thuật toán dạng này rồi nhưng trình còn non nên chưa tách được đoạn code đó.

    Cảm ơn các bác đã quan tâm.


  • 0

#2489 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

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

Đã gửi 10 April 2015 - 12:28 AM

Hỏi về code xác định điẻm nằm cách polyline một khoảng L và cách polyine 1 khoảng là a
Nghĩa là xác định điểm B nằm trên phương tiếp tuyến của Polyline tại điểm A và B cách A 1 khoảng là a
  • 0

#2490 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 April 2015 - 08:00 AM

Tue_NV có 1 câu hỏi nhìn nó có vẻ đơn giản nhưng chưa biết cách thức xử lý nó

Làm thế nào để tách kí tự "\" ra khỏi chuỗi "\037" -> Kết quả là  "037"                                                                                              Mình sử dụng hàm substr để trích chuỗi để xét thì thấy :                                                                                               Command: (substr "\037" 1 1) -> "\037". Chỉ lấy 1 ký tự mà nó ra hết                                                                                                                 Mong các bác chỉ giáo giúp! Thanks


  • 0

#2491 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 13 April 2015 - 08:07 AM

Chẳng hạn như vầy chăng:

(if (= (ascii "\037") 31) "037")


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


#2492 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 April 2015 - 08:38 AM

Chẳng hạn như vầy chăng:

(if (= (ascii "\037") 31) "037")

 

Chuỗi "kết quả"  trong hàm if "037" là bác tự đánh vào. Nếu thay vì "037" mà là số khác thì đánh vào biết bao nhiêu cho xuể

Vấn đề ở đây là từ chuỗi gốc lấy ra bác ạ

 

Kết quả mong muốn là từ chuỗi gốc "\037" -> tách ra chuỗi "037"

 


  • 0

#2493 ndtnv

ndtnv

    biết lệnh minsert

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

Đã gửi 13 April 2015 - 09:02 AM

Dùng hàm ascii, đổi kết quả ra octal, thêm 0 vào trước. Code hàm base lấy từ help

(defun BASE ( bas int / ret yyy zot )
(defun zot ( i1 i2 / xxx )
(if (> (setq xxx (rem i2 i1)) 9)
(chr (+ 55 xxx))
(itoa xxx)
)     
)
(setq ret (zot bas int) yyy (/ int bas))
(while (>= yyy bas)
(setq ret (strcat (zot bas yyy) ret))
(setq yyy (/ yyy bas))
)
(strcat (zot bas yyy) ret)
)
(base 8 (ascii "\037") )
=> "37"

  • 1

#2494 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 April 2015 - 09:19 AM

 

Dùng hàm ascii, đổi kết quả ra octal, thêm 0 vào trước. Code hàm base lấy từ help

(defun BASE ( bas int / ret yyy zot )
(defun zot ( i1 i2 / xxx )
(if (> (setq xxx (rem i2 i1)) 9)
(chr (+ 55 xxx))
(itoa xxx)
)     
)
(setq ret (zot bas int) yyy (/ int bas))
(while (>= yyy bas)
(setq ret (strcat (zot bas yyy) ret))
(setq yyy (/ yyy bas))
)
(strcat (zot bas yyy) ret)
)
(base 8 (ascii "\037") )
=> "37"

 

Cảm ơn bác nhiều!

Xin lỗi vì có lẽ là Tue_NV chưa nói rõ là nó có rất nhiều Trường hợp.

"Và mình chỉ muốn tách ký tự "\" ra khỏi chuỗi "\037"  và "037" chỉ là 1 trong các trường hợp đó mà thôi

 

Ví dụ : (base 8 (ascii "\038") -> "03" (kết quả mong muốn là "038")

hoặc (base 8 (ascii "\0a8") -> "00" (kêt quả mong muốn "0a8")

......

......

 


  • 0

#2495 ndtnv

ndtnv

    biết lệnh minsert

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

Đã gửi 13 April 2015 - 09:39 AM

Trong help Lisp xem \nnn là "Character whose octal code is nnn"

Vì vậy sau \0 phải là số octal hợp lệ (0 => 7)

các số 38, 39, a8 ... không phải là số octal nên lisp không lưu

VD :

(strlen "\0a8") => 0,

riêng chuỗi "\038" vì 3 là số octal hợp lệ, 8 không phải nên lisp lưu thành "\03" và "8"

(strlen "\038") => 2


  • 0

#2496 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 April 2015 - 10:28 AM

Trong help Lisp xem \nnn là "Character whose octal code is nnn"

Vì vậy sau \0 phải là số octal hợp lệ (0 => 7)

các số 38, 39, a8 ... không phải là số octal nên lisp không lưu

VD :

(strlen "\0a8") => 0,

riêng chuỗi "\038" vì 3 là số octal hợp lệ, 8 không phải nên lisp lưu thành "\03" và "8"

(strlen "\038") => 2

 

Cảm ơn bác!

Như vậy thì Lisp trên cũng không đúng cho mọi Trường hợp rồi.

Tue_NV cũng mong muốn có phương án giải quyết đúng cho mọi trường hợp


  • 0

#2497 pphung183

pphung183

    biết dimstyle

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

Đã gửi 13 April 2015 - 12:32 PM

Sau \0 phải là số octal hợp lệ (1 -->7), nếu không sẽ coi như chuỗi :  (strcat "\0a8") = (strcat "\088") = (strcat "\0a9") = … = ""

Lúc đó hàm sau kết hợp với hàm ndtnv chắc cũng tạm ổn :) :

(defun replace-str (str / c1)
(if (= 0 (strlen str)) str (progn
(setq c1 (chr (car (vl-string->list str))) new-str (base 8 (ascii c1))) 
(vl-string-subst new-str c1 str) )))


  • 1

#2498 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 April 2015 - 06:34 AM

 

Sau \0 phải là số octal hợp lệ (1 -->7), nếu không sẽ coi như chuỗi :  (strcat "\0a8") = (strcat "\088") = (strcat "\0a9") = … = ""

Lúc đó hàm sau kết hợp với hàm ndtnv chắc cũng tạm ổn :) :

(defun replace-str (str / c1)
(if (= 0 (strlen str)) str (progn
(setq c1 (chr (car (vl-string->list str))) new-str (base 8 (ascii c1))) 
(vl-string-subst new-str c1 str) )))

 

Cảm ơn bác. Mặc dù chưa thật trọn vẹn nhưng chắc là không còn cách nào khác


  • 0

#2499 luhaivinh

luhaivinh

    Edu level: li10

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

Đã gửi 14 May 2015 - 04:28 PM

Mọi người cho e hỏi làm sao để viết được tiếng việt có dấu tại các dòng nhắc với như ví dụ dưới đây với.

vd:  ví dụ này em lấy từ code của Nhoclangbat.

(prompt "Ch\U+1ECDn c\U+00E1c \U+0111\U+1ED1i t\U+01B0\U+1EE3ng m\U+00FAn \U+1EA9n:")


  • 0

#2500 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 14 May 2015 - 04:51 PM

Bạn dùng lisp này để chuyển từ Unicode sang Hexa

http://www.cadviet.c..._convert_ha.zip


  • 1

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