Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

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

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

[Hỏi về DCL dialog] em muốn hỏi một số vấn đề về dialog

Xin hỏi các bác trong Dialog của Cad em muốn làm một số điều sau đây, thì dùng lệnh/ từ khoá gì để làm được điều đó.

1. Mặc định khi Hộp thoại hiện lên sẽ đặt con trỏ chuột, (active key của Dialog) vào một key mà mình muốn, có áp dụng điều đó với key của edit_box { key .....} không?

2. Thay vì mặc định khi hiện H.Thoại là 1 key nào đó, giờ muốn khi chọn trong danh sách PopUp List1 thì mặc định của active key sau đó thay đổi do người lập trình quyết đinh?

Cảm ơn các bác

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âu 1 ý 1 để đặt trỏ vào 1 key: is_default = true;

Câu 1 ý 2 để trỏ vào edit_box: dùng hàm mode_tile

Câu 2 chưa hiểu

Cảm ơn bác, em đã thử,

1. với is_deafault đã từng dùng, không thích lắm

2. em đọc Help thì mode_tile dùng với cấu trúc (mode_tile key flag)

flag nhận giá trị interger 0->4, giá trị 1,0 em thường dùng, giá trị 2->4 không dùng bao giờ đang tìm hiểu, có vẻ nó thoả mãn được nhu cầu của e.

3. Nếu 2 làm được, 3 em làm được, cảm ơn bác

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

Mọi người cho hỏi tí:

Tại sao hàm vla-ZoomCenter khi chạy trong vòng lặp n lần thì dòng "command" cũng bị nhảy theo n lần, khiến nó nháy nháy ở dòng command, dù đã setvar cmdecho?

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

Không chỉ trong vòng lặp nó mới nhảy mà ở ngoài nó cũng nhảy, hàm này mỗi lần chạy sẽ print ra command line 1 ký tự xuống dòng. Kiểu như đó là 1 trong các nhiệm vụ của nó. Với zoom thì command lại nhanh hơn VLA nhiều. Trừ khi bác cần zoom callback của 1 reactor thì hãy dùng VLA, còn trong mọi trường hợp khác hãy dùng commmand.

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 anh/chị.

 

Em đang viết đoạn Lisp để mở bản vẽ(đoạn này em làm được rồi), sau đó sắp xếp các cửa sổ đang mở theo Tile Vertically

Nhưng đang bị bí quá,loay hoay mãi tìm không ra hàm nào làm được công việc này.

 

Anh/chị nào biết chỉ em với ạ.

 

Em 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

Các bác cho em hỏi chút ạ!

Khi bắt đầu thời từ lúc vẽ cho đến khi kết thúc em có 1 nhóm các đối tượng (Group1), sau đó em move nhóm đối tượng đó ra một vị trí khác (lúc đó nhóm đối tượng đó sẽ là Group2) để tạo thành một Wblock. Em muốn tóm được thằng Group2. Thao tác này được lặp đi lặp lại rất nhiều (nhiều Wblock với nhiều Group khác nhau) và em làm thao tác như này nhưng thấy càng về sau tốc độ chạy càng chậm (rồi nó đơ….chạy ngầm) nhưng vẫn ra kết quả. Em muốn nâng cấp để tăng tốc độ chương trình nên nhờ các bác chỉ giáo về cách thức.

 

 
(setq lstAll (list))
  (setq Elast (entlast))
  (while (< i n)
    (progn
      (setq P11 (vlax-curve-getPointAtParam Ob i)
   P22 (vlax-curve-getPointAtParam Ob (+ i 1))
      )

      (setq P_Goc (list (car P11) (cadr P22)))
      (TML1 P11 P22 Tleebd)
      (while
(setq Elast (entnext Elast))
(setq lstAll (reverse (cons Elast lstAll)))
      )
      (setq Elast2 (entlast))
      (ppn:vla-move-ss (CV:List-to-ss lstAll) P_Goc '(0 0 0))
      (while
(setq Elast2 (entnext Elast2))
(setq lstAll2 (reverse (cons Elast2 lstAll2)))
      )
      (command "-WBLOCK"
      (strcat "C:\\WBLOCK\\" "BV" (rtos (+ iii 1) 2 0) ".dwg")
      ""
      '(0 0 0)
      (CV:List-to-ss lstAll2)
      ""
      )
    )
    (setq iii (1+ iii))
    (setq i (+ i 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

Mình có ngàn rưỡi cái lisp chỉnh sửa đối tượng mà trong đó bước đầu tiên là chọn đối tượng sửa.

Nhớ nhiều mệt nên mình làm cái lisp chọn đối tượng xong tùy cái đối tượng đó là giống gì thì gọi cái lisp sửa tương ứng.

Vấn dề là làm sao gọi cái lệnh đó lên và biểu nó nhận cái đối tượng đã chọn trước để thực hiện mà ko phải chỉnh gì các lisp đã có cả.

Bác nào có hướng nào ko bày Duy vớ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

Ví dụ: Duy đã có 3 lisp xd xt xmt mỗi lisp bước đầu đều yêu cầu chọn 1 đối tượng duy nhất. Duy muốn gọi lệnh sd thì chọn 1 đối tượng là nó chạy luôn các lệnh xd xt xmt mà không hỏi chọn đối tượng 1 lần nửa (yêu cầu ko sửa lisp xd xt xmt còn lisp sd thì sửa thoải mái)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Chon mot doi tuong bat ky
;;;Cu phap su dung (duy:c_doituong<m mdich)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun duy:c_doituong<m (mdich / mdich dchon)
(princ (strcat "\nChon doi tuong " mdich " !"))
(setq dchon (car (entsel)))
(while
(null dchon)
(princ (strcat "\nChua chon duoc doi tuong. Chon doi tuong " mdich " !"))
(setq dchon (car (entsel)))
)
dchon)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:xt ()
(setq dtcd (duy:c_doituong<m "muon sua"))
(command ".erase" dtcd "")
(Princ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:xmt ()
(setq dtcd (duy:c_doituong<m "muon sua"))
(command ".erase" dtcd "")
(Princ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:xd ()
(setq dtcd (duy:c_doituong<m "muon sua"))
(command ".erase" dtcd "")
(Princ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:sd ()
(setq dtcd (duy:c_doituong<m "muon sua"))
(setq doituongs (entget dtcd))
(setq KIEUDOITUONG (cdr (assoc 0 doituongs)))

(Cond
((= KIEUDOITUONG "TEXT") (c:xt)  )
((= KIEUDOITUONG "MTEXT") (c:xmt)  )
((= KIEUDOITUONG "DIMENSION") (c:xd)  )
)
(Princ))



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ắc là vầy chăng?

 

(defun c:sd ()
 (mapcar '(lambda(x y) (vlax-add-cmd x y)) (list "xt" "xmt" "xd") (list 'c:xt 'c:xmt 'c:xd))
 (setq dtcd (duy:c_doituong<m "muon sua"))
 (setq doituongs (entget dtcd))
 (setq KIEUDOITUONG (cdr (assoc 0 doituongs)))
 (command "_.select" dtcd "")
 (Cond
  ((= KIEUDOITUONG "TEXT") (command "xt" dtcd))
  ((= KIEUDOITUONG "MTEXT") (command "xmt" dtcd))
  ((= KIEUDOITUONG "DIMENSION") (command "xd" dtcd)))
 (Princ))
  • 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

Các bác cho em hỏi xíu được không ạ!

Em copy viewport từ Layout sang Model.

Vậy làm sao có thể lấy được tọa độ của các đỉnh của Viewport được các bác nhỉ?

Em định convert Viewport thành Pline. Hic hic

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

Không biết lệnh EXPLODE có vấn đề gì mà lisp sau của mình ko chạy. Trong khi đó nếu thay lệnh EXPLODE bằng lệnh khác ví dụ ERASE thì chạy được. Các bác xoi giúp với.

(defun c:xbv ()
(command "undo" "be") 

(cond
((/= (ssget "x" '((0 . "dimension"))) nil) (command ".EXPLODE" (ssget "x" '((0 . "dimension"))) ""))
)


(cond
((/= (ssget "x" '((0 . "hatch"))) nil) (command ".EXPLODE" (ssget "x" '((0 . "hatch"))) ""))
)


(command "undo" "end") 
(Princ)
) 

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

1). Thay đổi biến EXPLMODE từ 0 sang 1. Nếu chưa được thì thử bước 2.

2). Thay đổi biến QAFLAGS. Đây cũng là biến hệ thống nhưng không có Help, nếu Google sẽ có.

  • 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

Có mấy Property value của Viewport: Center, Height, Width => (Vlax-get obj 'value).

Hoặc:

+ Dxf 10: Center point

+ Dxf 40: Width

+ Dxf 41: Height

Cảm ơn 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

Các bác cho em nhờ chút:

Em có một tập hợp nhiều đối tượng (Line, Poline, Spline, Circle, Rec, Arc,...)

Giờ em muốn lọc các đối tượng đó, cái nào dài hơn 200 chẳng hạn thì đổi màu và layer sang một màu mới.

Các cao thủ có thể giúp em được ko ạ.

Trân trọng 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

Topic này dùng để hỏi về thuật toán, ý tưởng... chứ không phải nhờ viết lisp. Bạn nên tạo 1 topic mới sẽ phù hợp hơn.

Riêng trường hợp của bạn có thể dùng lệnh qselect, rồi thay đổ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

Ai biết thuật toán này tên gì không mách bảo tí để tìm hiểu:

Cho n điểm A,B,C,D,E... (gọi chung là các điểm X) trên m.phẳng. M là điểm di động. Các chi phí đơn vị từ M đến X là kX (đã biết). MX là các khoảng cách từ M đến X.

Tìm vị trí điểm M sao cho tổng chi phí là nhỏ nhất:

(MA*kA+MB*kB+MC*kC+MD*kD+ME*kE+...) -> Min

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

Ai biết thuật toán này tên gì không mách bảo tí để tìm hiểu:

Cho n điểm A,B,C,D,E... (gọi chung là các điểm X) trên m.phẳng. M là điểm di động. Các chi phí đơn vị từ M đến X là kX (đã biết). MX là các khoảng cách từ M đến X.

Tìm vị trí điểm M sao cho tổng chi phí là nhỏ nhất:

(MA*kA+MB*kB+MC*kC+MD*kD+ME*kE+...) -> Min

Mình cá là GS. Châu cũng bó tay :D, mình chỉ cần cho 2 điểm thôi (ko cần n điểm).

Tìm M để: ka*MA + Kb*MB -> Min

 

Ít nhất chắc cũng cần quan hệ giữa ka với kb chứ nhỉ  :huh:

 

Have fun! :D

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

Ơ hay! kA và kB là các hằng số đã biết thì quan hệ giữa kA và kB là đã biết rồi, và bài toán 2 điểm thì giải được chứ sao lại không!

Nhắc lại cho rõ đề: các hằng số kX là đã biết, không phụ thuộc vị trí 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

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


×