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

#2441 phamhuy1

phamhuy1

    biết vẽ rectang

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

Đã gửi 17 February 2015 - 12:58 PM

Cho em hỏi Code

(setq eset (ssget (list (cons 0 "text") (cons 1 "#*")))) chọn số dương. Vậy muốn chọn cả số dương và âm thì Code sao??? :(


  • 0

#2442 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 17 February 2015 - 04:28 PM

Cho em hỏi Code

(setq eset (ssget (list (cons 0 "text") (cons 1 "#*")))) chọn số dương. Vậy muốn chọn cả số dương và âm thì Code sao??? :(

Tết không nghỉ sao còn làm việc nữa!

Tàm tạm thì dùng cái này (vì chọn số trực tiếp từ ssget hình như chưa ai làm được?)

(setq so (ssget '((0 . "*TEXT") (1 . "~*[~-0--9]*"))))


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


#2443 phamhuy1

phamhuy1

    biết vẽ rectang

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

Đã gửi 17 February 2015 - 07:02 PM

Thanks a Ha! Rãnh rỗi em mở lisp cũ tính các text số thấy khâu quét chọn Text  chưa lọc để quét chọn theo ý mình :) .Chúc Anh năm mới Dồi dào sức khỏe, Thành công!!!


  • 0

#2444 003vetinh

003vetinh

    biết pan

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

Đã gửi 22 February 2015 - 05:05 PM

Hề hề, bác BigBill ơi,
Bác chỉ cần thêm một phát code này vào trước dòng (princ) là Ok:
(setvar "osmode" oslast )


  • 0

chuyennhatrongoi.com.vn là web site cung cấp da co2, xe ô tô, taxi tải thành hưng


#2445 taybacincc

taybacincc

    biết vẽ circle

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

Đã gửi 27 February 2015 - 04:44 PM

Chào các bác. Chúc các bác và diễn đàn năm mới nhiều thành công mới. Có 2 câu hỏi nho nhỏ nhờ các bác trợ giúp ạ.

 

1. Câu hỏi 1

 

Các bác xử lý hộ em bài này vs ạ. Em có 1 list dạng như sau:

 

……(1040 . 647.57) (1040 . 0.0) (1000 . "") (1000 . "") (1000 . "")…..

 

Trong dấu “…” đằng trước vào đằng sau là có rất nhiều những phần tử trong list có dạng như đoạn list e trích dẫn. Bây giờ e muốn lấy ra vị trí của 1 phần tử trong list. Phần tử muốn lấy đứng ngay trước phần tử có giá trị “(1040 . 0.0)”. Trong list chỉ có duy nhất 1 phần tử có giá trị “(1040 . 0.0)”.Đây là đặc điểm duy nhất để tìm ra vị trí của phần tử cần lấy (theo e biết.)

 

2. Câu hỏi 2

 

Em muốn viết trong lisp lệnh tương tự với việc mình cầm điểm NODE trên pline mình kéo ý ạ. Em thấy trên COMMAND nó ghi là :

=========

Command:

** STRETCH **

Specify stretch point or [Base point/Copy/Undo/eXit]:

=========

Nhưng em không rõ là có lệnh nào hoặc viết trong lisp như thế nào để có kết quả tương tự.

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


  • 0

#2446 cadvietedu

cadvietedu

    Trung tâm đào tạo CADViet

  • Moderator
  • PipPipPipPip
  • 261 Bài viết
Điểm đánh giá: 20 (tàm tạm)

Đã gửi 28 February 2015 - 06:51 AM

Trả lời bạn:
1. Bạn dùng mã lệnh này (cadr (member mark (reverse lst)))
Trong đó:
mark là (1040 . 0.0)
lst là ……(1040 . 647.57) (1040 . 0.0) (1000 . "") (1000 . "") (1000 . "")
Giải thích: mã lệnh trên lấy phần tử thứ HAI trên kết quả tìm kiếm phần tử mark (phần tử thứ NHẤT luôn là mark) trong danh sách đảo ngược của list

2. Bạn dùng lệnh stretch với các thông số phù hợp
Nếu điểm bạn click ở vị trí đầu tiên gọi là p1, điểm bạn kéo thả ở vị trí tiếp theo là p2, thì mã lệnh là
(command ".stretch" "c" p1 p1 "" p1 p2)
  • 2

#2447 taybacincc

taybacincc

    biết vẽ circle

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

Đã gửi 28 February 2015 - 11:01 AM

Vâng. Cảm ơn bác nha


  • 0

#2448 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 28 February 2015 - 03:04 PM

Chào các bác. Chúc các bác và diễn đàn năm mới nhiều thành công mới. Có 2 câu hỏi nho nhỏ nhờ các bác trợ giúp ạ.

 

1. Câu hỏi 1

 

Các bác xử lý hộ em bài này vs ạ. Em có 1 list dạng như sau:

 

……(1040 . 647.57) (1040 . 0.0) (1000 . "") (1000 . "") (1000 . "")…..

 

Trong dấu “…” đằng trước vào đằng sau là có rất nhiều những phần tử trong list có dạng như đoạn list e trích dẫn. Bây giờ e muốn lấy ra vị trí của 1 phần tử trong list. Phần tử muốn lấy đứng ngay trước phần tử có giá trị “(1040 . 0.0)”. Trong list chỉ có duy nhất 1 phần tử có giá trị “(1040 . 0.0)”.Đây là đặc điểm duy nhất để tìm ra vị trí của phần tử cần lấy (theo e biết.)

 

2. Câu hỏi 2

 

Em muốn viết trong lisp lệnh tương tự với việc mình cầm điểm NODE trên pline mình kéo ý ạ. Em thấy trên COMMAND nó ghi là :

=========

Command:

** STRETCH **

Specify stretch point or [Base point/Copy/Undo/eXit]:

=========

Nhưng em không rõ là có lệnh nào hoặc viết trong lisp như thế nào để có kết quả tương tự.

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

Hề hề hề,

1/- Có thể như sau:

(nth (1- (vl-position mark lst)) lst)

với cùng chú giải ở trên.

Lưu ý là trong trường hợp phần tử mark đứng ngay đầu danh sách lst thì không thể dùng code này bởi khi đó không có phần tử nào đứng trước nó cả và code sẽ trả về nil. Với code của bác cadvietedu cũng vậy.

2/- Bạn phải test thử đoạn code của bác cadvietedu bởi các đời cad khác nhau có thể sẽ có cách dùng lệnh này khác nhau.......


  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2449 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 March 2015 - 05:16 PM

Qua mấy ngày nghiên cứu về chủ đề reactor thì mình có kết luận thế này:
- Reactor: là 1 đối tượng dữ liệu bản vẽ, nó kết nối các sự kiện autocad (event-name) với các hàm lisp (callback_function) ngay khi sự kiện sảy ra. Vì là đối tượng dữ liệu bản vẽ nên giống như mọi đối tượng khác, nó sẽ tồn tại cùng bản vẽ cho đến khi bị remove đi.
- Sự kết nối mà 1 reactor tạo ra giữa event-namecallback-function theo mặc định là không bền vững. sự kết nối này bị mất đi khi đóng bản vẽ dù đối tượng reactor vẫn tồn tại trong cơ sở dữ liệu của bản vẽ đó. Có thể thiết lập tính bền vững cho kết nối bằng các hàm (vlr-pers reactor) và (vlr-pers-release reactor)
- Hàm callback-function là 1 hàm lisp nên nó cần phải được load khi mở bản vẽ thì kết nối của reactor mới có tác dụng. Trong trường hợp kết nối của reactor được thiết lập bền vững, khi sự kiện sảy ra mà hàm callback-function chưa được load thì chương trình báo lỗi.


Như vậy là kết luận trên của bạn Tue_NV chưa hoàn toàn chính xác.
- reactor không tự động bị mất đi, nó chỉ bị mất khi ta chủ động xóa nó.
- vì thế ta chỉ cần load lại hàm callback-function chứ không cần phải tái tạo lại reactor.

Mình mới nghiên cứu nên những ý kiến trên có thể đúng, có thể sai, mong các bạn góp ý và hi vọng các bạn tiếp tục thảo luận về chủ đề này, hơi khó 1 chút nhưng khá hay. Mình tìm thấy mấy topic trong 4r bàn về reactor nhưng hơi ít thông tin để tham khảo

 

Chào bác ThuyLinh313 và các bác!

Có thể cho mình xin 1 ví dụ về vấn đề này không?

Mình sử dụng Reactor rồi. Sau khi đóng và mở bản vẽ lại thì nó không còn liên kết nữa?

Vậy có thể thiết lập sự liên kết bền vững này khi đóng và mở bản vẽ này như thế nào để Reactor không bị mất đi?

 

Xin được chỉ giáo giúp!

Tue_NV xin cảm ơn!


  • 0

#2450 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 14 March 2015 - 01:57 PM

 Bác dùng ví dụ sau:

1. down lsp này về.

(defun c:bat()
  (if (not reactor)
    (setq reactor (vlr-pers (vlr-command-reactor nil '((:vlr-commandEnded . EndCommand))))))
  (vlr-add reactor)       
  (princ)
)
 
(defun c:tat()
  (if (vlr-added-p reactor)
    (progn (vlr-remove reactor)
      (if file (close file))))
)
 
(defun dxf(id v) (cdr (assoc id (entget v))))
    
(defun GeD(v / l en)  
  (vlax-for item (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (dxf 2 v))
    (if (= "MTEXT" (dxf 0 (setq en (vlax-vla-object->ename item))))
(setq l en))
  ) l
)
 
(defun EndCommand (calling-reactor endcommandInfo ) 
    (if (member (nth 0 endcommandInfo) '("DIMLINEAR" "DIMALIGNED"))
       (ghichu))
)
 
(defun ghichu(/ pt v mtxt tt10 tt50 tt40 tt41)
    (if (and sodem (< sodem 20))
      (setq sodem (1+ sodem))
      (setq sodem 1))
    
    (setq v (entlast)
 mtxt (ged v)
 tt10 (dxf 10 mtxt)
 tt50 (dxf 50 mtxt)
 tt40 (dxf 40 mtxt)
 tt41 (cdr (assoc 41 (tblsearch "style" (dxf 7 mtxt))))
 pt (polar tt10 tt50 (* -0.5 (+ tt40 (dxf 42 mtxt)))))   
   
    (entmake (list (cons 0 "TEXT") (cons 10 pt) (cons 11 pt) (cons 40 tt40) (cons 7 (dxf 7 mtxt))
  (cons 41 tt41) (cons 72 2) (cons 73 2) (cons 50 tt50)
  (cons 1 (strcat "(A" (itoa sodem) ")"))))
)

 

2. Mở file cad mới, load lsp trên, đánh lệnh "bat", vẽ 1,2 cái dim. Save file, đóng file.

3. Mở lại file đó, load lsp, vẽ dim sẽ thấy reactor vẫn còn (ko cần gõ "bat" đê tạo lại reactor).

 

 


  • 1

#2451 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 March 2015 - 03:56 PM

Oh, Cảm ơn bác Tot77 nhiều. Đúng là cái Reactor không bị mất đi khi đóng và mở lại bản vẽ (điều kiện là phải load các hàm con trong lsp khi mở lại bản vẽ)

 

Xin bác cho hỏi có cách nào dùng Reactor mà lưu giữ lại giá trị trong lsp được không? Ví dụ mình vẽ dim từ A1... đến A3... rồi. Giờ đóng bản vẽ và mở lại bản vẽ mình muốn ghi tiếp giá trị là A4... có được không?

Hiện tại thì khi đóng và mở lại bản vẽ thì lsp ghi lại từ đầu A1...

 

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


  • 0

#2452 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 14 March 2015 - 04:07 PM

Bác có thể dùng biến hthong useri1-5 để lưu giá trị, nó sẽ dc lưu cùng với file.
  • 1

#2453 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 March 2015 - 08:46 PM

Cảm ơn bác Tot77. Việc sử dụng biến hệ thống USERR1-5 thì mình cũng biết. Chỉ muốn hỏi là Reator có thể lưu lại giá trị hay không? Mình đoán chắc là không ^_^

 

1 điểm nữa là khi sử dụng ví dụ trong code của bác. Vấn đề nảy sinh là khi tắt và mở lại bản vẽ thì sử dụng Reactor vẫn còn đó. Tuy nhiên sử dụng lệnh TAT để tắt liên kết đi thì không được

Command: tat ; error: bad argument type: VLReactor: nil 

 

Cái này mình thấy lỗi do đối số do biến reactor chưa được khởi tạo khi mở lại bản vẽ

(bởi do khi mở bản vẽ không dùng lệnh bat để khởi tạo biến reactor mà trong thân hàm lệnh TAT đã sử dụng biến reactor rồi (defun c:tat() (if (vlr-added-p reactor) 

 

Một điểm nữa là khi tắt và mở lại bản vẽ là cho dù dùng lệnh bat để khởi tạo reactor nhưng dùng lệnh TAT thì không thể "tắt" được cái Reactor đó. Bác xem lại chỗ này giúp mình với. Cảm ơn bác!


  • 0

#2454 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 15 March 2015 - 11:34 AM

Vấn đề này mình cũng đã trao đổi 1 lần ở topic nào đó về Reactor. Tue_NV hỏi trong topic này nên mình nhắc lại luôn tại đây.

Bạn để ý cấu trúc hàm tạo ra 1 reactor bất kỳ đều có 1 đối số là data. Mọi người thường để nil vì không biết nó làm được những gì, hoặc không sử dụng nó. Với mình thì ứng dụng của nó là rất lớn. Bạn có thể ghi thông tin cần lưu giữ vào nó.

 

- Data chấp nhận mọi kiểu dữ liệu, kể cả là một hàm hay 1 đoạn code thực thi.

- Data của 1 reactor không bị đóng chết nội dung theo nội dung bạn ghi vào nó khi tạo ra reactor. Bạn có thể đọc, sửa, ghi đè và xóa nó bất kỳ lúc nào bạn muốn, kể cả ngay trong quá trình thực thi callback của chính nó.

- Data không giới hạn kích thước thông tin (bit) ghi vào nó.

 

Xét về hình thái dữ liệu và tiềm năng sử dụng thì data tương đối giống xrecord nhưng có ưu nhược điểm sau:

- Dễ tạo, dễ truy xuất và chỉnh sửa, sử dụng linh hoạt với reactor.

- Dễ bị vô tình xóa đi bởi 1 ứng dụng khác có sử dụng các hàm xóa reactor. Xrecord thì chỉ người lập trình ra ứng dụng mới truy cập được nên bảo vệ dữ liệu tốt hơn.

------------------------------------

Mình trả lời nội dung bạn hỏi Tot77 luôn.

Có thể tot77 viết 1 ví dụ cho bạn vì câu hỏi #2449 nên viết như vậy chứ nếu viết ứng dụng hoàn chỉnh thì không viết kiểu vậy được. Sẽ tạo ra rác reactor sau mỗi lần tắt mở bản vẽ. 

Việc sử dụng 1 biến đển nhận diện 1 reactor chỉ phù hợp khi reactor đó được tạo ra và xóa đi trong 1 lệnh cụ thể. Khi tạo ra reactor dạng "chạy nền" thì phải sử dụng data đẻ nhận diện 1 reactor. sẽ tránh được trường hợp như trên. Để xác định 1 reactor, bạn cần kết hợp các hàm Vlr-reactors và Vlr-data


  • 1

#2455 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 15 March 2015 - 12:52 PM

Đúng như ThuyLinh nói, ví dụ trên chỉ minh hoạ cho cái vlr-pers thôi, vì vây ko đăt tên cho reactor.

Nếu muốn viết kỹ hơn thì sửa hàm bat như sau:

(defun c:bat(/ DATA REACTORS)
(setq data (mapcar 'vlr-data  (setq reactors (cdar (vlr-reactors :vlr-command-reactor)))))
  (if (not (member "comreactor" data))
    (setq reactor (vlr-pers (vlr-command-reactor "comreactor" '((:vlr-commandEnded . EndCommand)))))
(setq reactor (nth (vl-position "comreactor" data) reactors))
)
  (princ)
)

và thêm dòng (c:bat) ở cuối file.


  • 1

#2456 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

Đã gửi 25 March 2015 - 01:20 AM

Chào các anh em, các bác! Cho em làm phiền (hỏi lạc đề với các mục trên) 1 chút ạ!

Em muốn đếm số lẻ phần thập phân của một số nhưng khi thực hiện thì không đúng như yêu cầu.

Em dùng hàm như sau:

(strlen (substr (rtos (float Number)) (+ (vl-string-search "." (rtos (float Number))) 2) (strlen (rtos (float Number))))) 

Ví dụ: (setq Number 0.0993347)

Nhưng giá trị lại trả về 4 do hàm (rtos (float Number)) = "0.0993"

Các bác có thể tư vấn cho em được không ạ? 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







#2457 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 25 March 2015 - 08:26 AM

 

- ý tưởng thô thiển của nhoc là trong lsp set unit tối đa 8 số lẽ ^^, chuyển số thành chuỗi, đảo ngược chuổi, loại bỏ các số 0 dư, cuối cùng là đếm hihi, nếu số thập phân của anh dài hơn 8 số lẽ thì nhoc chưa nghĩ ra ^^


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

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








#2458 ndtnv

ndtnv

    biết lệnh minsert

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

Đã gửi 25 March 2015 - 08:27 AM

Cho độ chính xác tăng lên vd

(rtos (float Number) 2 15)

chú ý dimzin


  • 1

#2459 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

Đã gửi 25 March 2015 - 08:32 AM

Cảm ơn em nhoclangbat và bác ntdnv. 

Em đang định dùng thuật toán kiểm tra số có phải là số nguyên ko? Nếu ko phải số nguyên thì nhân tiếp 10 cho đến khi đúng điều kiện số nguyên thì dừng vòng lặp.

Không biết cách này ổn ko?

Em cũng đang 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







#2460 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 25 March 2015 - 09:15 AM

Thử:

(equal num (fix num) 1E-15)


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