Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

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

Các bài được khuyến nghị

Cái này làm trên lisp chậm lắm. Bản vẽ nhỏ còn đc, nếu lớn chạy lâu và nếu line thay đổi vị trí thì cập nhật mệt lắm. Mình làm từ năm 1993 nay kg dùng nữa (kg biết ý tưởng có giống bạn hay kg). Tại sao bạn kg dùng cadmap hay microstation.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cái này làm trên lisp chậm lắm. Bản vẽ nhỏ còn đc, nếu lớn chạy lâu và nếu line thay đổi vị trí thì cập nhật mệt lắm. Mình làm từ năm 1993 nay kg dùng nữa (kg biết ý tưởng có giống bạn hay kg). Tại sao bạn kg dùng cadmap hay microstation.

Em xin lỗi, em xử lý bài toán theo danh sách, ko thể nói chậm hay nhanh.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Em ở trong nam bác ạ. Híc

 

 

Mấy bài viết kiểu như thế này đề nghị Bạn trinhhoanghieu090 và thanhduan2407 nên gửi vào tin nhắn riêng

Mất thời gian của người đọc và theo dõi!

Mình sẽ delete mấy bài viết kiểu như thế này!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

hì hì, sorry bác Thanh Duan em chen ngang tí, em có vấn đề này cần các pro tư vấn:

Khi viết một text nam tron vào một khung HCN, thì một cạnh của hình chữ nhật dễ dàng tính được theo text hight. Cạnh còn lại được tính theo (* độ rộng chữ chiều dài chữ), khổ nỗi độ rộng chữ lại phụ thuộc vào từng font và cả cái tỷ lệ "width factor" do người dùng chọn. Các bác cho em một vài ý tưởng được không ạ. Thanks các bác.

Bạn có thể dùng boundingbox để vẽ hình CN bao quanh text. Đối với text nghiêng thì đường bao vẫn thẳng.

:mellow:  :mellow:

(vla-getBoundingBox (vlax-ename->vla-object (car (entsel "\nChon text:"))) 'minp 'maxp)
(setq li (mapcar 'vlax-safearray->list (list minp maxp)))
(command "rectang" "non" (car li) "non" (last li))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Bạn có thể dùng boundingbox để vẽ hình CN bao quanh text.

(vla-getBoundingBox (vlax-ename->vla-object (car (entsel "\nChon text:"))) 'minp 'maxp)
(setq li (mapcar 'vlax-safearray->list (list minp maxp)))
(command "rectang" "non" (car li) "non" (last li))

 

Bác coi chừng cái Text "nghiêng" ! 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cho em hỏi ké một chút ạ!

Em có 1 danh sách (list '(1 2 4 3) '(2 6 4) '(3 4 6 7 5) '(4 6 7 5) '(6 7 5))

Em muốn loại bỏ mảng được lặp lại các phần tử có trong danh sách. Ví dụ trong danh sách trên thì em loại bỏ '(4 6 7 5)  và '(6 7 5)) ra khỏi danh sách thì phương thức loại bỏ như nào vậy các bác?

(list '(1 2 4 3) '(2 6 4) '(3 4 6 7 5) '(4 6 7 5) '(6 7 5)) => (list '(1 2 4 3) '(2 6 4) '(3 4 6 7 5))

Em cảm ơn các bác nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Phải chăng ý của bác Duẫn là muốn "vạch mặt" những list con mà tất cả những phần tử của nó đã xuất hiện ít nhất 1 lần trong các list con khác (xét từ đầu đến cuối) ???

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Phải chăng ý của bác Duẫn là muốn "vạch mặt" những list con mà tất cả những phần tử của nó đã xuất hiện ít nhất 1 lần trong các list con khác (xét từ đầu đến cuối) ???

Đúng rồi bác hiepttr ! Hii.

Cảm ơn bác tien2005 nhé! Em đã thành công rồi

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

chúng ta đã có lệnh alignspace để align 2 điểm trên model theo 2 điểm trên viewport. Vậy chúng ta có thể viết code ngược lại: có 2 điểm trên viewport thì tìm được 2 điểm tương ứng trên model được không? mở rộng ra là với viewport n đỉnh thì ta có n điểm trên model. Nếu được xin giúp đoạn code này

 

Ứng dụng: ở layout ta chọn đối tượng viewport, lisp trả về cho ta tập chọn các đối tượng trên model tương ứng với viewport được chọn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

- hi mấy anh cho nhoc hỏi ngoài lề xíu ^^, tốc độ thực thi của Lsp phụ thuộc vào phiên bản cad hay cấu hình máy tính nhỉ, đó giờ nhoc cũng nghi vấn nhưng chưa test thử, nay bùn bùn test thử ^^

- cùng 1 lsp nhoc test trên lap nhoc hay làm core i5 cad2014 tạo khoảng 5k đối tượng (lsp này nhoc chỉ dùng vòng lặp với entmake) mất 4 phút mới chạy xong.

- chạy thử trên máy bàn của thằng em cũng core i5 cad2015 tạo như trên chỉ mất gần 1 phút ^^

- tuy cùng core i5 nhưng chưa chắc thằng nào mạnh hơn ^^ nhoc nghĩ còn phụ thuộc nhiều yếu tố khác, về khoảng xem cấu hình máy nhoc chưa pit nhiều ^^

-p/s: mấy anh mod thấy nhoc lạc đề move hộ nhoc hen ^^

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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??? :(

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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]*"))))

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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)

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

 

 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×