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ị

duy267    7

Mình có tập hợp L1(a1 a2 a3 a1 a6 a2 a4 a3 a5). Bây giờ mình muốn tìm tập hợp L2 gồm những phần tữ trong L1 không lặp lại quá một lần(trùng nhau). Trong ví dụ trên thì L2(a6 a4 a5). Các bạn có thể giúp mình đoạn code này không. 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
ThuyLinh313    146
Mình có tập hợp L1(a1 a2 a3 a1 a6 a2 a4 a3 a5). Bây giờ mình muốn tìm tập hợp L2 gồm những phần tữ trong L1 không lặp lại quá một lần(trùng nhau). Trong ví dụ trên thì L2(a6 a4 a5). Các bạn có thể giúp mình đoạn code này không. Xin cảm ơn.

Bạn dùng hàm này nhé

(defun remove-all-duplicates (lst / lst1 lst2)
(mapcar (function (lambda (x)                  
               	(if (or
                		(member x (setq lst (cdr lst)))
                		(member x lst1)
                		(member x lst2))
          		(setq lst2 (cons x lst2))
          		(setq lst1 (cons x lst1))))) lst)
(reverse lst1))

Ngược lại, nếu bạn muốn lấy ra toàn bộ phần từ trùng nhau trong lisp thì thay (reverse lst1) bằng (reverse lst2)

  • 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
Tue_NV    3.841

Mình có tập hợp L1(a1 a2 a3 a1 a6 a2 a4 a3 a5). Bây giờ mình muốn tìm tập hợp L2 gồm những phần tữ trong L1 không lặp lại quá một lần(trùng nhau). Trong ví dụ trên thì L2(a6 a4 a5). Các bạn có thể giúp mình đoạn code này không. Xin cảm ơn.

Đây bạn :

 

(setq L2 '())

(foreach x L1 (if (null (member x (cdr(member x L1)))) (setq L2 (append L2 (list x)))))

 

Hoặc code gọn hơn:

(vl-remove-if '(lambda(x) (member x (cdr(member x L1)))) L1)

  • 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
Tue_NV    3.841

Hàm của bác Tue_NV sai rồi.

Nếu (setq l1 '(1 2 2)) => l2=nil.

- Hàm của Tue_NV có cả hàm trên và hàm dưới :lol:

- Hàm dưới không sai (dùng vl-remove-if)

- Hàm trên không sai đâu bác, L2 trả về '(1))

Cái bác thấy là nil là giá trị trả về của hàm if lần lặp cuối của vòng foreach, chứ không phải L2 là nil

 

Nếu bác muốn thấy trị trả về của hàm if lần lặp cuối của vòng foreach thì sửa như sau:

(setq L2 '())

(foreach x L1 (if (null (member x (cdr(member x L1)))) (setq L2 (append L2 (list x))) L2))

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
duy782006    1.374

(defun c:ghtd ()

(initdia)

(command "dimstyle")

;(command "STYLE")

;(command "hatch")

(princ))

 

Mình viết lisp để gọi hộp thoại dim như trên thì không lên được mặc dù thử với style và hatch thì ok. Các bác giúp 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
Doan Van Ha    2.676

Hàm (initdia) không cho gọi dimstyle.

Trích dẫn:

(initdia [dialogflag])

Currently, the following commands make use of the initdia function: ATTDEF, ATTEXT, BHATCH, BLOCK, COLOR, IMAGE, IMAGEADJUST, INSERT, LAYER, LINETYPE, MTEXT, PLOT, RENAME, STYLE, TOOLBAR, and VIEW.

 

Dùng:

(command "ddim")

  • 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
ThuyLinh313    146

Mình tìm ra cách rồi. có 2 cách liền ^^

- Dùng (vla-sendcommand activedocument "dimstyle ")

- Dùng Sendkeys

 

Vừa viết xong thì thấy DVH post. cách của DVH xịn nhất rồi.

Chỉnh sửa theo ThuyLinh313

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 xin chào tất cả mọi người!

Em cũng mới bắt đầu tìm học Autolisp! Mà em chưa thông thạo cách sử dụng trên diễn đàn cho lắm. Anh nào có tài liệu học Autolisp mong các anh chiếu cố gửi cho em qua email: ce.nguyenhuutrang@gmail.com

Mong chờ tin các anh!

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
ketxu    2.652

Mình viết lisp để gọi hộp thoại dim như trên thì không lên được mặc dù thử với style và hatch thì ok. Các bác giúp với!

Bác Duy chưa search http://www.cadviet.com/forum/index.php?showtopic=13203&view=findpost&p=119717

  • 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
Chiron    91

Chiron test thử đoạn code sau:

(defun c:test (/ txtht txtdis txtpt1 txtpt2 txtpt3)
 (setq txtht (getvar "textsize")
txtdis (* txtht 1.5)
txtpt1 (getpoint "\nSpecify start point of text:")
txtpt2 (list (car txtpt1) (- (cadr txtpt1) txtdis))
txtpt3 (list (car txtpt1) (- (cadr txtpt2) txtdis))
 )
 (command ".text" txtpt1 txtht 0 "\nLine 1")
 (command ".text" txtpt2 txtht 0 "\nLine 2")
 (command ".text" txtpt3 txtht 0 "\nLine 3")
 (princ)
)

Khi mở file mới thì xuất hiện 3 dòng text rất đẹp. Nhưng lại bị lỗi khoảng cách dòng & justity với file này: http://www.cadviet.com/upfiles/3/102896_test.dwg

 

102896_capture_1.png

Mong các bác sửa dùm hoặc có code nào hay hơn thì cho Chiron xin.

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
Doan Van Ha    2.676

Các dòng (command ".text"...) của bạn có thể bị lỗi nếu height của text khác 0. Có 2 trường hợp để dùng (command ".text"...):

- Khi height = 0: của bạn đúng.

- Khi height /= 0: của bạn sai. Và phải sửa là:

(command ".text" pt 0 "ABC")

  • 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
Chiron    91

Cảm ơn Bác DVH. Bác có thể giải thích rõ hơn không? Chiron test lại:

 

.text

Current text style: "Standard" Text height: 500.000 Annotative: No

Specify start point of text or [Justify/Style]:

Specify height <500.000>:

Specify rotation angle of text <0.00>: 0

Enter text: ABC

Lần theo từng dòng command thì: nhập ".text" > Chọn điểm chèn > Nhập chiều cao text > Nhập góc quay > Nhập nội dung. Hình như dòng command của Bác bị thiếu 1 thông số?

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
Doan Van Ha    2.676

Bạn chú ý điều này: có 2 cách đặt textstyle: height=0 và height khác 0. Bạn thử đặt bằng 2 cách, sau đó thử gọi lệnh text ứng với từng cách thì sẽ thấy ngay thô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
Chiron    91

Đã thử lại và đã hiểu ý bác DVH nhưng trong file CAD Chiron upload không có qui định chiều cao text mà? Khi chương trình chạy nó chèn text bị trùng nhau và theo justify là Top Left chứ không phải Left (với CAD cũ) hoặc Start (với CAD mới). Lạ là khi double click vào text đó thì text nhảy lên trên (??)

P/S: Hình như lỗi chỉ xảy ra khi dùng font shx? Vì khi đổi text style sang font TrueType thì chạy rất tốt.

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
Chiron    91

Các bác cho hỏi có cách nào để lấy text width của text style hiện tại không? Khi dùng entmake thì text chèn vào không quan tâm đến text width.

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
Tue_NV    3.841

Các bác cho hỏi có cách nào để lấy text width của text style hiện tại không? Khi dùng entmake thì text chèn vào không quan tâm đến text width.

Bạn sử dụng hàm tblsearch

  • 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
gia_bach    1.442

Lấy Width_Factor của TextStyle hiện hành :

(cdr (assoc 41 (tblsearch "Style" (getvar "textstyle"))))

  • 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
Chiron    91

Cảm ơn các Bác. Code đã chạy ngon lành :)

(defun make_text (txtpt txtval)
 (entmake (list '(0 . "TEXT")
            	(cons 10 txtpt)
            	(cons 40 (getvar "TEXTSIZE"))
                (cons 41 (cdr (assoc 41 (tblsearch "Style" (getvar "textstyle")))))
            	(cons 1 txtval)
            	'(50 . 0.0)
            	(cons 7 (getvar "TEXTSTYLE"))
            	'(71 . 0)
            	'(72 . 0)
            	'(73 . 0)
            	(cons 11 txtpt)
)
 )
)

  • 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
ketxu    2.652

Mình tưởng 7 và 41 lấy theo current chứ nhỉ ^^ (un-tested)

Mà ai lại (cons 41 (cdr (assoc 41 ....) thế kia Chiron ơi, giống bác H nói là tụt ra rùi lại mặc vô đó ^^

  • 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


×