Đến nội dung


Hình ảnh
* * * - - 3 Bình chọn

Hướng dẫn lập trình Lisp


  • Please log in to reply
497 replies to this topic

#281 codered8x

codered8x

    biết lệnh copy

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

Đã gửi 10 October 2010 - 05:02 PM

Các bác ơi em dùng cái lisp lấy DXF để xem điểm chèn của một block mà thế nào nó bị lệch so với xem ở Properties :cheers:( Block tạo mới thì đúng nhưng đây là Block có sẵn trên bản vẽ (mà bản vẽ thì em nhận từ người khác :cheers: , có bác nào bít tại sao không ah?

bạn thay đổi ucs về world xem sao
(command "UCS" "W")
  • 1

#282 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 06 November 2010 - 03:10 PM

He, Em khắc phục được roài các bác ah, bổ sung thêm (getvar "ucsorg") là Okie
  • 0

#283 theduyhuynh

theduyhuynh

    Chưa sử dụng CAD

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

Đã gửi 07 November 2010 - 05:10 AM

các bác có thư viện về hàm trong lisp ko ?
Ví dụ: hàm TEXT trong cửa sổ command thì ta nhập :
1- Toa do
2- Goc
3- Danh noi dung vao con nhay

Do đó khi viết trong lisp sẽ như thế nào ở phần gõ nội dung con nháy (command "text" "@-700,-200" "0" "nộidung" )
  • 0

#284 hung22121983

hung22121983

    Chưa sử dụng CAD

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

Đã gửi 19 November 2010 - 02:45 PM

Cho em hỏi thế này mấy bác giúp em giải đáp với, nghe nói mấy cái lập trình lisp nay ko có tác dụng với 3d solid, em mò trên mạng thì thấy có cái file lisp này khá hay và có liên quan đến solid nhưng ko hiểu cho lắm, hình như là chỉnh sửa edge và mặt của solid,mấy phần acis và sat là dùng cho solid phải ko ạ,mong các đại cao thủ chỉ giúp:
(defun draw_aperture (pnt color / p1 p2 p3 p4)
(setq p1 (mapcar'+(trans(list(- aperture)(- aperture)0)2 1 T)pnt)
p2 (mapcar'+(trans(list(- aperture) aperture 0)2 1 T)pnt)
p3 (mapcar'+(trans(list aperture aperture 0)2 1 T)pnt)
p4 (mapcar'+(trans(list aperture (- aperture)0)2 1 T)pnt)
)
(grvecs(list color p1 p2 p2 p3 p3 p4 p4 p1))
)

(defun acis_poll(/ acis_translate); device point points pointn entity
entityPrev viewsize viewctr aperture sat)

(defun acis_translate(string / item letter lst)
(setq string(strcat string" ")item"")
(while(>(strlen string)0)
(setq letter(substr string 1 1)string(substr string 2))
(if(=" "letter)
(setq lst(append lst(list item))item"")
(setq item(strcat item(chr(- 159(ascii letter)))))
)
)
lst
)


(setq index_X (cond ; we'll have to figure this out soon!
('LATEST_VERSION 4)
('PREVIOUS_VERSION 2)
)
)


(while(=(car(setq device(grread T 4 2)))5)
(and pointn(draw_aperture pointn 0))
(or(=(getvar"VIEWSIZE")viewsize)
(=(getvar"VIEWCTR" )viewctr )
(setq viewctr (getvar"VIEWCTR" )
viewsize(getvar"VIEWSIZE")
aperture(*(/
viewsize(cadr(getvar"screensize")))(getvar"APERTURE"))
)
)
(setq point(cadr device)entity(nentselp point))
(if(and entity
(setq entity(entget(car entity)))
(member(cdr(assoc 0 entity))'("3DSOLID""REGION"))
(or(equal entityPrev(setq entityPrev(cdr(assoc -1 entity))))
(progn
(setq points()
sat())
(foreach group entity(and(=(car group)1)(setq sat(append
sat(list(acis_translate(cdr group)))))))
(foreach line sat
(cond
((wcmatch(car line)"point") ;;; this works for straight
edges
(setq points(cons(list 0(distof(nth index_X
line))(distof(nth(+ index_X 1)line))(distof(nth(+ index_X 2)line)))points))
)
((wcmatch(car line)"coedge") ;;; start here for curved
surface support
;(setq points(cons(compute_center_point)points))
)
)
)
)
T
)
)
(setq points(mapcar'(lambda(pnt)(cons(distance(cdr(reverse(trans point
1 2)))(cdr(reverse(trans(cdr pnt)0 2))))(cdr pnt)))points)
pointn(cdr(assoc(apply'min(mapcar'car points))points))
)
(setq pointn()entity())
)
(and pointn(draw_aperture pointn 2))
)
(and pointn(draw_aperture pointn 0))
(if entity(list(cdr(assoc -1 entity))pointn))
)
  • 0

#285 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 27 November 2010 - 12:48 AM

Một số hàm con của mình yêu cầu số lượng tham số tương đối lớn (khoảng 7-10 tham số) nên việc nhớ được thứ tự của từng tham số, định dạng của từng tham số là rất khó. vì thế mỗi lần dùng đến lại phải mở file thư viện ra để tra.
thay vì phải làm như thế mình muốn đưa các thông báo lỗi kèm theo hướng dẫn khai báo tham số khi khai báo tham số sai vào hàm thông báo lỗi *error* của cad, nhưng chưa biết phải làm cách nào
các bác chạy thử hàm này khi không khai báo tham số và xem thông báo trả về sẽ hiểu đc ý của mình: (ACET-SS-DRAG-MOVE)
  • 0

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


#286 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 22 December 2010 - 11:16 AM

Trong bản vẽ có nhiều UCS. làm thế nào ta có thể thay đổi hệ tọa độ qua lại giữa các UCS này?
Cụ thể: bản vẽ có 2 UCS người dùng tự định nghĩa là A và B. khi A đang hiện hành mình muốn chuyển sang B thì làm như thế nào?
  • 0

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


#287 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 28 December 2010 - 08:02 AM

Cho mình hỏi về hàm lọc, ban đầu chọn 1 tập hợp đối tượng => đặt biến là ss

(setq ss (ssget))

Mình muốn tách ss thành thành phần ss1 (chứ text) và ss2 (chứa line, polyline) ss3 (chứa dim) thì phải dùng lệnh như thế nào ?
  • 0

#288 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 28 December 2010 - 08:52 AM

Cho mình hỏi về hàm lọc, ban đầu chọn 1 tập hợp đối tượng => đặt biến là ss

(setq ss (ssget))

Mình muốn tách ss thành thành phần ss1 (chứ text) và ss2 (chứa line, polyline) ss3 (chứa dim) thì phải dùng lệnh như thế nào ?

Có nhiều cách. Tue_NV xin trình bày 1 cách :
Đầu tiên, chọn 1 tập hợp đối tượng => đặt biến là ss
(setq ss (ssget))
-> Lập tức, lấy ss1 (chứa text)
(setq ss1 (ssget "P" '((0 . "TEXT"))))

-> Tập ss2
(setq ss2 (ssget "P" '((0 . "*LINE"))))

-> Tập ss3
(setq ss3 (ssget "P" '((0 . "DIMENSION"))))


Trong bản vẽ có nhiều UCS. làm thế nào ta có thể thay đổi hệ tọa độ qua lại giữa các UCS này?
Cụ thể: bản vẽ có 2 UCS người dùng tự định nghĩa là A và B. khi A đang hiện hành mình muốn chuyển sang B thì làm như thế nào?

Ý của bạn như thế này phải không?

(setq name (getstring t "\nnhap ten UCS"))
(vl-cmdf "UCS" "NA" "R" name)
  • 3

#289 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 28 December 2010 - 11:13 AM

@Tue_VN: thanks bạn rất nhiều, xin hỏi còn cách lọc khác nữa không (dùng hàm lọc lấy thông số từ biến ss)
  • 0

#290 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 December 2010 - 11:42 AM

@Tue_VN: thanks bạn rất nhiều, xin hỏi còn cách lọc khác nữa không (dùng hàm lọc lấy thông số từ biến ss)

Bạn dùng thử cái ni xem có được không nhé.

(defun c:ldt (/ ss i n e le)
(setq ss (ssget)
i 0
n (sslength ss)
ss1 (ssadd)
ss2 (ssadd)
ss3 (ssadd)
)
(while (< i n)
(setq e (ename ss i)
le (cdr (assoc 0 (entget e)))
)
(if (= le "TEXT")
(setq ss1 (ssadd e ss1))
)
(if ( or (= le "LINE") (= le "LWPOLYLINE") (= le "POLYLINE") )
(setq ss2 (ssadd e ss2))
)
(if (= le "DIMENSION")
(setq ss3 (ssadd e ss3))
)
(setq i (1+ i))
)
)

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

#291 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 28 December 2010 - 12:01 PM

@Tue_VN: thanks bạn rất nhiều, xin hỏi còn cách lọc khác nữa không (dùng hàm lọc lấy thông số từ biến ss)

Bạn thử cái này
(defun laydt(ss kieu)
(acet-list-to-ss
(vl-remove-if '(lambda(x)
(null (wcmatch (acet-dxf 0 (entget x)) kieu)))
(acet-ss-to-list ss)
)
)
)
1. Tạo hàm con như trên
2.Tậo tập chọn ss
(setq ss (ssget))
Lấy tập ss1
(setq ss1 (Laydt ss "TEXT"))
Lấy tập ss2
(setq ss2 (Laydt ss "*LINE"))
Lấy tập ss3
(setq ss3 (Laydt ss "DIMENSION"))
  • 2

#292 hdt4151

hdt4151

    biết vẽ pline

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

Đã gửi 28 December 2010 - 01:18 PM

thanks bạn, cách tạo hàm con như trên rất hay !!
  • 0

#293 doan_kt

doan_kt

    biết pan

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

Đã gửi 20 January 2011 - 09:33 PM

Vẫn theo cách thức như các bài trước, mời bạn chạy thử chương trình rồi ta bàn bạc tiếp. Lần này nhiều thứ lôi thôi hơn, ssg đã chuẩn bị sẵn, bạn chỉ việc copy toàn bộ thư mục Relax vào thư mục gốc của AutoCAD, sau đó appload file relax.lsp là xong. Nếu appload thành công sẽ xuất hiện menu có tên Relax ở vị trí thứ 10 (tính từ trái qua) giống như hình trên.
bác Hoành cho em hỏi cụ thể thư mục gốc nói ở trên là chỗ nào ko ạ, thanksss ( bài viết của Bác rất bổ ích ) ^^
  • 0

#294 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 21 January 2011 - 08:19 PM

Vẫn theo cách thức như các bài trước, mời bạn chạy thử chương trình rồi ta bàn bạc tiếp. Lần này nhiều thứ lôi thôi hơn, ssg đã chuẩn bị sẵn, bạn chỉ việc copy toàn bộ thư mục Relax vào thư mục gốc của AutoCAD, sau đó appload file relax.lsp là xong. Nếu appload thành công sẽ xuất hiện menu có tên Relax ở vị trí thứ 10 (tính từ trái qua) giống như hình trên.
bác Hoành cho em hỏi cụ thể thư mục gốc nói ở trên là chỗ nào ko ạ, thanksss ( bài viết của Bác rất bổ ích ) ^^

Bác SSg chuyển sang dùng nick này à....
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#295 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 January 2011 - 11:20 PM

Bác SSg chuyển sang dùng nick này à....

Đâu, bạn ấy copy nguyên lời anh ssg đó mà bác ^^
  • 0

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


#296 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 12 February 2011 - 03:34 PM

Có cách nào để entmod 1 đối tuợng con của đối tuợng xref không nhỉ. chỉnh sửa nội dung 1 đối tuợng text chẳng hạn. đôi khi mình luời không muốn mở Xref editor :)
  • 0

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


#297 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 20 February 2011 - 11:23 PM

Thật mệt mỏi với hàm Command quá!
Các chương trình sử lý 1 khối luợng lớn các công việc bằng hàm Command không những gây chậm mà còn có nhuợc điểm rất khó chịu là khi chuơng trình chạy xong, muốn undo lại rất cực khổ, chờ dài cổ mới xong, ngoài ra còn kèm theo 1 loạt thông báo (Lisp Expression) ngứa mắt, đôi khi làm treo máy luôn. Biết vậy nhưng thỉnh thoảng vẫn fải dùng đến Command.
Các bác có cách nào khắc phục được vấn đề này không? hoặc chí ít là tắt cái dòng thông báo kia đi khi undo, chắc sẽ nhanh hơn chút xíu.
  • 0

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


#298 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 20 February 2011 - 11:38 PM

Thật mệt mỏi với hàm Command quá!
Các chương trình sử lý 1 khối luợng lớn các công việc bằng hàm Command không những gây chậm mà còn có nhuợc điểm rất khó chịu là khi chuơng trình chạy xong, muốn undo lại rất cực khổ, chờ dài cổ mới xong, ngoài ra còn kèm theo 1 loạt thông báo (Lisp Expression) ngứa mắt, đôi khi làm treo máy luôn. Biết vậy nhưng thỉnh thoảng vẫn fải dùng đến Command.
Các bác có cách nào khắc phục được vấn đề này không? hoặc chí ít là tắt cái dòng thông báo kia đi khi undo, chắc sẽ nhanh hơn chút xíu.

Ơ sao bác không dùng hàm bẫy lỗi và set undo điểm đầu -> cuối cho nó đỡ khổ.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#299 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 21 February 2011 - 02:38 PM

có lẽ phamngoctukts chưa hiểu điều mình nói.
bạn viết code như thế này.
(defun C:test nil
(command "undo" "begin")
.... làm 1 việc gì đó khoảng 5000 lần bằng hàm command. (viết 1 nội dung text ra màn hình chẳng hạn)
(command "undo" "end") (princ))

rồi sau khi chạy lệnh test bạn thử undo lại xem. mời bạn ngồi chờ <_<
  • 0

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


#300 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 26 February 2011 - 08:23 AM

Mình muốn làm tròn tọa độ đỉnh của một polyline có sẵn trên bản vẽ về 2 số lẽ nhưng chưa biết cách nào. Bạn nào biết hướng dẫn cho mình hoặc chỉ mình trang nào đề cập vđ này. Mình tìm kg thấy. Cám ơn các bạn
  • 0