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

#1241 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 19 July 2012 - 06:25 PM

Cảm ơn Ha nhe,đúng là đổi lại thì được.Không hiểu tại sao nhỉ?

Nên dùng cái tên hệ thống đặt cho nó. Thay vì viết vhelven.ttf hay vhelven_0.ttf bạn hãy dùng VNI-Helve
  • 0

#1242 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 23 July 2012 - 09:10 PM

Mình đang tập tọe thằng entmake. Lập thử hàm tạo layer như sau:

(defun duy:t_layer (tl m lt / tl m lt)
(cond
((= m "") (setq m 7) )
((= lt "") (setq lt "Continuous") )
)
(cond
((= nill (tblsearch "layer" tl)) (entmake (list (cons 0 "LAYER")(cons 100 "AcDbSymbolTableRecord")(cons 100 "AcDbLayerTableRecord")(cons 2 tl)(cons 70 0)(cons 62 m)(cons 6 lt))) )
((/= nill (tblsearch "layer" tl)) (princ (strcat "\nLayer < " tl " > da ton tai trong ban ve!"))))
)
(princ)



Test thử như sau:
(duy:t_layer "duy1" 20 "")
Thì được nghĩa là Linetype nếu nhập "" thì tự nhận thành Continuous được

Nhưng dòng:
(duy:t_layer "duy2" "" "")
Thì lổi nghĩa là giá trị color không tự nhận thành 7 được. Các bác đi trước hướng dẩn mình chút. Cám ơn!
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#1243 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 July 2012 - 09:50 PM

Vấn đề ở việc bác dùng hàm Cond. hàm này đi từ trên xuống dưới, cái nào condition trả về khác Nil thì nó làm, k làm tiếp thằng sau bác ạ
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1244 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 24 July 2012 - 08:16 AM

Có cách nào để lấy ra được danh sách của toàn bộ biến toàn cục có giá trị khác nil tồn tại trong bản vẽ không nhỉ?
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1245 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 24 July 2012 - 09:40 AM

A thử xem sao :

(vl-remove-if '(lambda(x)(vl-position (type (eval x)) (list 'EXRXSUBR 'SUBR 'nil))) (atoms-family 0))

  • 3

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1246 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 24 July 2012 - 11:42 AM

Giỏi xế! cái gì cũng biết. Chuẩn luôn roài. nét dư sony luôn ketxu ạ :D
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1247 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 26 July 2012 - 03:03 PM

Cho mình hỏi cái này với, về dấu "
Muốn ghi vào file f dòng chữ acb" thì phải viết code thế nào ?

Mình thử các trường hợp này đều bị lỗi :(

(write-line "abc" f)
(write-line "abc"" f)
(write-line "abc""" f)
  • 0

#1248 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 26 July 2012 - 03:26 PM

Cho mình hỏi cái này với, về dấu "
Muốn ghi vào file f dòng chữ acb" thì phải viết code thế nào ?

Mình thử các trường hợp này đều bị lỗi :(

(write-line "abc" f)
(write-line "abc"" f)
(write-line "abc""" f)

Hề hề hề,
Theo cái sự mót của mình thì dòng code đầu tiên là đúng cú pháp.
Tuy nhiên bạn cần lưu ý như sau:
1/- f phải là một biến biểu thị file bạn muốn ghi vào đã được mở ra. Thường thì người ta dùng (setq f (open filename "W")) trong đó filename là cái tên của file bạn cần ghi vào và tham số "w" để biểu thị rằng file bạn mở được phép ghi vào.
2/- Sau ghi ghi vào rồi thì kết quả chỉ có thể được hiển thị khi bạn đóng file lại (tức là bạn chấp nhận save sự thay đổi này lại) bằng hàm (close f)

Hy vọng bạn sẽ thành công.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1249 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 July 2012 - 03:47 PM

Ký tự " là 1 ký tự được bảo vệ trong ngôn ngữ lisp. nó có chức năng đánh dấu điểm đầu và điểm cuối của 1 chuỗi. bởi vậy để đưa ký tự này vào chuỗi thì bạn phải dùng 1 ký tự \ đi kèm với nó để định nghĩa nó là chuỗi.
dòng code bạn cần viết là (write-line "abc\"" f)
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#1250 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 27 July 2012 - 07:31 AM

Bổ sung luôn cho bạn hdt4151 là ký tự chấm phẩy, ngoặc đơn và xuyệt cũng tương tự
  • 1

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#1251 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 27 July 2012 - 07:07 PM

Mình có bv có rất lớn và đủ thứ các đối tượng. Mình có một tập chọn ss chứa rất lớn các đối tượng nhưng kg phải là toàn bộ các đối tượng trong bản vẽ. Bây giờ muốn chọn nhanh tập chọn ss1 theo kiểu (ssget "c"), hay "cp", "w" ,"wp", nhưng những đối tượng chọn được chỉ có trong ss thôi thì làm thế nào. Ở đây mình loại trừ cách duyệt qua ss1 để tìm sự xuất hiện của đt trong ss vì cách này rất lâu. Cám ơn các bạn
  • 0

#1252 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 27 July 2012 - 09:23 PM

Mình có bv có rất lớn và đủ thứ các đối tượng. Mình có một tập chọn ss chứa rất lớn các đối tượng nhưng kg phải là toàn bộ các đối tượng trong bản vẽ. Bây giờ muốn chọn nhanh tập chọn ss1 theo kiểu (ssget "c"), hay "cp", "w" ,"wp", nhưng những đối tượng chọn được chỉ có trong ss thôi thì làm thế nào. Ở đây mình loại trừ cách duyệt qua ss1 để tìm sự xuất hiện của đt trong ss vì cách này rất lâu. Cám ơn các bạn

Chào bác TrungNgaMy
Hàm ssget chưa có cách chọn đối tượng như điều mà bác nói ở trên ạ.
Cách duyệt qua ss1 có lẽ là cách duy nhất.
Bác có thể sử dụng hàm ssmemb để xem 1 ename có thuộc tập ss hay không?
  • 1

#1253 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 03 August 2012 - 11:47 PM

Cho một curve hở và một điểm bất kỳ nằm trên nó. Có thể xác định điểm này cách đầu curve một khoảng dài (kg phải khoảng cách) bao nhiêu bằng cách nào vậy các bác. Mình biết có hàm xác định điểm cách curve một khoảng cho trước nhưng kg biết có hàm như mình nói kg. Cám ơn các bác.
  • 0

#1254 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 04 August 2012 - 12:02 AM

Từ hàm này sẽ suy ra điều bác hỏi:

;----- Lay diem tren Curve cach pg khoang cach kc, voi ph la diem dinh huong tren Curve.
(defun GetP (pg ph kc cur / dg dh dp)
(setq dg (vlax-curve-getDistAtPoint cur pg))
(setq dh (vlax-curve-getDistAtPoint cur ph))
(if (> dh dg)
(setq dp (+ dg kc))
(setq dp (- dg kc)))
(vlax-curve-getPointAtDist cur dp))

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


#1255 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 04 August 2012 - 12:48 AM

Ca

Từ hàm này sẽ suy ra điều bác hỏi:


;----- Lay diem tren Curve cach pg khoang cach kc, voi ph la diem dinh huong tren Curve.
(defun GetP (pg ph kc cur / dg dh dp)
(setq dg (vlax-curve-getDistAtPoint cur pg))
(setq dh (vlax-curve-getDistAtPoint cur ph))
(if (> dh dg)
(setq dp (+ dg kc))
(setq dp (- dg kc)))
(vlax-curve-getPointAtDist cur dp))

Cám ơn bác ĐVH, có lẽ mình diễn tả hơi tồi nên bác viết code quá dư. Thực ra chỉ cần hàm vlax-cuve-getDistAtPoint là đủ
  • 0

#1256 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 08 August 2012 - 09:27 AM

Cho mình hỏi dùng lisp có nén file được không nhỉ (dạng bình thường cơ bản thôi, không dùng hỗ trợ của winzip, rar...) ?
  • 0

#1257 quang_lac

quang_lac

    biết lệnh mirror

  • Members
  • PipPipPip
  • 151 Bài viết
Điểm đánh giá: 11 (tàm tạm)

Đã gửi 11 August 2012 - 06:20 PM

mọi người cho mình hỏi 1 chút. Mình xuất dữ liệu ra màn hình cad, mình muốn số xuất ra có 3 chữ số sau dấu phẩy thì dùng lệnh nào.
Ví dụ: 14.12 thành 14.120
  • 0

#1258 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 11 August 2012 - 06:25 PM

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


#1259 vuminhchau

vuminhchau

    biết vẽ polygon

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

Đã gửi 18 August 2012 - 04:04 PM

em copy được đoạn lisp code kích thước này, mong các anh cao thủ ở đấy giúp em thêm chức năng tùy chọn ghi kích thước ra ngoài hình vuông hay trong hình vuông với! vì tụi em vẽ thì kích thước đất thì nằm ở ngoài, còn kích thước nhà thì nằm ở trong nên mỗi lần code kích thước xong là phải kéo ra hoặc kéo vào theo ý muốn rất mời gian với những thửa phức tạp.
và giúp em cho nó ẩn đoạn thực thi màu đỏ khi chạy lệnh dưới này đi:
Command: kkt
Select objects: Specify opposite corner: 4 found
Select objects:
so phan tu da chon : 4
he he heUnknown command "KKT". Press F1 for help.
he he heUnknown command "KKT". Press F1 for help.
he he heUnknown command "KKT". Press F1 for help.
he he heUnknown command "KKT". Press F1 for help.
4
rất mong các anh giúp đỡ em với, cảm ơn các anh nhiều!
đây là hình minh họa và lisp:
hình:
Hình đã gửi

code:
(defun c:kkt(/ chon lenlist i ename tdx tdy)
(setq chon (ssget))
(if (/= chon nil)
(progn
(setq lenlist (sslength chon))
(princ "so phan tu da chon : ")(princ lenlist)
(princ "\n")
(setq i 0)
(while (< i lenlist)
(princ "he he he")
(setq ename (ssname chon i))
(setq ename (entget ename))
(setq tdx (cdr (assoc 10 ename)))
(setq tdy (cdr (assoc 11 ename)))
(command "dimaligned" tdx tdy tdy "")
(setq i (+ 1 i))
)
)
)
)
=======================
em muốn cho đoạn này vào code mà không được, nó cứ báo lỗi nên em đành phải copy thế này mặc dù không đúng quy định!
  • 0

#1260 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 18 August 2012 - 04:31 PM

Để hết "màu đỏ" thì sửa dòng này:
(command "dimaligned" tdx tdy tdy "")
Thành dòng này:
(command "dimaligned" tdx tdy tdy)
  • 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.