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

[Hỏi] Cùng nhau học LISP

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

Từ hồi vào phần viết lisp theo yêu cầu,down về,rồi xào xáo cho giống giống form của mình,cảm giác đã thật thích..Rồi lại nghỉ đến chuyện mình tự viết r 1 đoạn lisp nhỏ,rồi sử dụng hàng ngày,cảm giác chắc hẳn là yomost ^^.Mình nghĩ trên diễn đàn có rất nhiều người muốn học lisp,nhưng có nhiều câu hỏi nhiều khi ngại không muốn hỏi.Để tránh làm loãng topic hướng dẫn sử dụng,hay Hướng dẫn học lisp,viết lisp theo yêu cầu...mình lập topic này để mọi người cùng trao đổi thắc mắc,không nên ngại ngần,có hỏi mới giỏi được (tất nhiên là nên nghĩ rồi n chưa ra thì mới hỏi ^^),rồi mong các bậc tiền bối dành thời gian giải đáp^^.Và việc tốt nhất là cùng nhau giải quyết một vấn đề từ nhỏ tới lớn,tức là 1 ví dụ cụ thể,từ đó rút ra cách áp dụng cho vấn đề của mình,làm được 1 ctrình made by myself :(

Mình mở màn bằng request đã gửi bên mục Viết lisp theo yêu cầu,nay post lại đây,mong mọi người cùng chỉ dẫn và trao đổi

Đầu tiên,mình muốn vẽ định vị cột như hình vẽ sau bằng lisp,với một quy cách định trước

Đầu vào : 
- Command :dvc
- Nhập tỉ lệ định vẽ.(Tỉ lệ mặc định là 1/20)
- Cạnh a :(user nhập chiều dài thực tế,mặc định là 220) - Ví dụ 300
- Ký hiệu Trục cạnh a(mặc định là -)
- Cạnh b :(user nhập chiều dài thực tế)
- Ký hiệu Trục cạnh b,(mặc định là -)

Sau bước này thì hình chữ nhật định vị cột sẽ hiện ra ở con trỏ chuột và chờ người dùng pick điểm đặt.Điểm đặt là tâm cột (trực quan)

Yêu cầu cần thực hiện :
- Vẽ cột với layer COT,bằng pline hoặc line,nếu layer này chưa có thì tạo layer với tên COT,màu 30,chiều dày nét 0.3mm- Hatch cột vừa tạo bằng pat betong,tỉ lệ hatch 10,góc hatch 0
- Vẽ 2 đường gióng trục cột bằng layer TRUC,cụ thể trục đi qua trung điểm 2 cạnh cột,nếu chưa có thì tạo layer TRUC,màu 251,dày 0.5
Trục thò ra bên ngoài cột 2mm ( chiều dài thực )
- Dim chi tiết từ trục ra cạnh cột,dim tổng thể.Chân dim cách cạnh cột 4mm(chiều dài thực),chân dim dài 5mm(cdài thực).
- Kiểu dim là Dx (với x là tỉ lệ nhập vào từ đầu),layer DIM (nếu chưa có layer và dimstyle này thì tạo ra)
- Ghi chú ký hiệu 2 trục với style chữ GHICHU,layer Text,nếu chưa có thì tạo ra
- Ky hiệu trục nằm trong vòng tròn bán kính 5.75mm (thực).Hình tròn này vẽ bằng layer MANH,màu abc,dày abc..nếu chưa có thì tạo ra
- Vòng tròn ký hiệu nằm cách dim tổng 1 đoạn 2mm,được nối với dim tổng bằng 1 đoạn thẳng với layer THAY,,màu abc,dày abc..nếu chưa có thì tạo ra

- Mục đích học hỏi : 
+ Làm sao để vẽ 1 hình chữ nhật,sau đó để tâm HCN vào đầu con trỏ
+ Sau khi tạo ra hcn đó,làm sao để thao tác hatch trực tiếp với đối tượng vừa tạo ra,nhất là nếu vẽ bằng line hứ k phải pline
+ Làm sao để dim 2 đầu mút cạnh hcn,giả sử nó được vẽ bằng pl chứ không phải line ?và với khoảng cách định trước của dim so với đường thẳng,chiều dài chân dim?
+ Làm thế nào để xác định trung điểm đoạn dim ( để ghi ký hiệu)
+ Phần chữ màu nhạt tức là mình có thể giải quyết bằng cách thiết lập ngay từ khi tạo bản vẽ,hoặc tạo 1 file template.
Còn nếu khởi tạo bằng lisp,thì với các hàm con tạo layer theo màu,chều dày nét thì mình đã biết,nhưng với tạo dimstyle thì chưa biết,vì có quá nhiều thiết đặt ở đấy,và mình không biết tìm các biến thiết đặt này ở đâu

69423628.gif

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

Chào bạn ketxu,

Yêu cầu của bạn không khó. Tuy nhiên do bạn muốn "từ hnay sẽ bắt đầu nghiên cứu để hiểu hơn về nó..Biết đâu sau này lại giúp lại được những anh em khác^^", nên không ai có thể gạt bỏ cái ước muốn ấy của bạn.

Vậy bạn hãy bắt tay vào làm đi nhé. Bắt đầu từ bước đầu tiên là tạo cho được cái hình chữ nhật có định vị ở tâm. Mình chưa hiểu hết ý định của bạn song có nhẽ chả cần cái định vị ở tâm này. Vấn đề bạn cần là copy hay move cái hình chữ nhật này sao cho cái tâm của nó về trúng cái vị trí mà bạn pick. Do đó theo ngu ý của mình thì khi copy hay move bạn chỉ cần lấy điểm gốc của cái sự copy hay move ấy chính là cái tâm hình chữ nhật là OK bạn ạ. Như vậy thì hình như nó sẽ đơng giản hơn cái vụ phải có cái tâm của hình chữ nhật bạn ạ.

Hề hề hề. vài lời góp ý mong bạn chóng thành cô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

Vấn đề là khi tạo ra cột định vị,điểm chèn thường là tâm của cột,tại chỗ giao nhau của các cột.Mình muốn hình sẽ pause tại tâm chuột để mình chỉ kick vào giao điểm của các trục thôi.Còn nều tạo xong mới copy xong move thì...^^

THứ 2 nữa,mình phân vân không biết nếu vẽ cột bằng line thì có thể thực hiện việc đó không.Mong mọi người chỉ bảo

  • 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

1. Bạn chọn 1 điểm tâm -> Sử dụng hàm getpoint

2. Xác định điểm góc trái bên dưới (từ điểm tâm, từ chiều dài, chiều rộng cột)

3. Vẽ hình chữ nhật bằng Line hay Pline hoặc Rectang

  • 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
Trích dẫn(Tue_NV @ Sep 20 2010, 11:25)

1. Bạn chọn 1 điểm tâm -> Sử dụng hàm getpoint

2. Xác định điểm góc trái bên dưới (từ điểm tâm, từ chiều dài, chiều rộng cột)

3. Vẽ hình chữ nhật bằng Line hay Pline hoặc Rectang

 

Vấn đề của mình là tạo HCN,sau đó "cầm" nó để pick vào các điểm tâm một cách trực quan,gần gần giống như copy vậy. code mình mới viết được như ở dưới.Nhưng bị vướng ở chỗ mình đã tạo điểm tâm rõ ràng rồi,nhưng không hiểu sao nếu user nhập vào bằng bàn phím chiều dài cạnh,thì Tâm lại là trung điểm 1 cạnh Còn nếu user input chiều dài cạnh bằng cách pick điểm thì mới đúng ý mình.Thêm 1 ý nữa,lệnh copy chỉ thực hiện 1 lần,kể cả khi đã thêm dòng multiple trước khi thực hiện lệnh ,không đúng ý mình..Mọi người xem code giùm mình với.Vạn sự khởi đầu nan ( Cám ơn mọi người

 

file: recc.lsp

(defun C:RECc (/ GOC1 dx dy temp-1 temp-2 GOC2 TAM)

(setq GOC1 (getpoint "\nDiem dat.: ")

dx (getdist "\nChieu dai canh theo truc x: ")

dy (getdist "\nChieu dai canh theo theo truc y: ")

GOC2 (list (+ (car GOC1) dx) (+ (cadr GOC1) dy) 0)

TAM (list (+ (car GOC1) (/ dx 2)) (+ (cadr GOC1) (/ dy 2)) 0)

)

(vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2

"_.copy" "L" "" TAM pause)

)

 

À,nhưng đây là đối tượng độc lập duy nhất,nên dùng copy với tham số L còn có ý nghĩa,chứ nếu mình tạo hcn rồi,hatch rồi,dim rồi,abc rồi,thì ý tưởng của mình phá sản luôn,vì không biết làm sao chọn lại 1 loạt các đối tượng từ lúc chạy lệnh đến lúc tạo xong tập đối tượng Ai có ý tưởng gì giúp mình vớ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
Trích dẫn(ketxu @ Sep 20 2010, 17:40)

Vấn đề của mình là tạo HCN,sau đó "cầm" nó để pick vào các điểm tâm một cách trực quan,gần gần giống như copy vậy. code mình mới viết được như ở dưới.Nhưng bị vướng ở chỗ mình đã tạo điểm tâm rõ ràng rồi,nhưng không hiểu sao nếu user nhập vào bằng bàn phím chiều dài cạnh,thì Tâm lại là trung điểm 1 cạnh Còn nếu user input chiều dài cạnh bằng cách pick điểm thì mới đúng ý mình.Thêm 1 ý nữa,lệnh copy chỉ thực hiện 1 lần,kể cả khi đã thêm dòng multiple trước khi thực hiện lệnh ,không đúng ý mình..Mọi người xem code giùm mình với.Vạn sự khởi đầu nan ( Cám ơn mọi người

phamngoctukts

Mình chỉnh sửa lại cho đúng ý bạn rồi nhé

 

file: recc.lsp

;; free lisp from cadviet.com(defun C:RECc (/ GOC1 dx dy temp-1 temp-2 GOC2 TAM)(setq dx (getdist "\nChieu dai canh theo truc x: ")dy (getdist "\nChieu dai canh theo theo truc y: ")GOC1 (getpoint "\nDiem dat.: ")GOC2 (list (+ (car GOC1) dx) (+ (cadr GOC1) dy) 0)TAM (list (+ (car GOC1) (/ dx 2)) (+ (cadr GOC1) (/ dy 2)) 0))(vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2"_.copy" "L" "" "m" TAM pause))

 

Sau khi bạn tạo hình chữ nhật xong tạo cho nó một biến để sau này dung lại.

Khi tạo xong dùng hàm entlast. Ví dụ (setq el (entlast)). Biến el chính là hình chữ nhật bạn vừa tạo.

khi bạn muốn hatch nó chỉ việc: (vl-cmdf "hatch" "tenvatlieu" "tile" el "") là hình chữ nhật của bạn se đưọc hatch. Chúc bạn mau chóng 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
Phamthanhbinh

Chào bạn ketxu,

Rất vui vì bạn đã bắt tay vào thực thi cái ước muốn của mình.

Về cái lisp bạn đã viết khá tốt đấy chứ. Nó chạy hoàn toàn đúng kể cả khi bạn nhập khoảng cách dx dy từ bàn phím bạn ạ. Việc bạn chạy lỗi có nhẽ là do thao tác nhập liệu của bạn mà thôi. Có thể là do bạn chỉ nhập một biến dx hoặc một biến dy bạn ạ, Phải nhớ nhập đủ cả hai biến dx và dy.

Còn việc copy chỉ được một lần là do bạn chưa sử dụng đúng cái tham số multiple của lệnh copy mà thôi. Bạn chỉ cần bổ sung vào đoạn lisp:

(vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2 "_.copy" "L" "" TAM pause) để nó trở thành:

(vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2 "_.copy" "L" "" "m" TAM pause) là Ok.

 

 

 

Để chọn nhiều đối tượng vào trong tập hợp để copy, bạn chỉ cần đặt tên biến cho các đối tượng này rồi sau đó khi dùng lệnh copy bạn gọi lại chúng là Ok.

Ví dụ: (setq hat (command "hatch" .......))

(setq dim1 (command "dimesion" ......))

..........

Sau đó khi copy thi

(command "copy" hat dim1 .... "" "m" tam pause)....

Bạn hãy thử xem nhé.

Chúc bạn thành công....

 

PS: Bạn chú ý trong cái hàm copy của bạn có sử dụng cái biến tam để làm điểm mốc cho sự copy. Đó chính là cái lý do mình nói với bạn trong bài post trước là không cần thiết phải vẽ cái tâm của hình chữ nhật làm chi, chỉ cần khi copy bạn lấy điểm mốc copy là điểm tâm của hình chữ nhật là Ok bạ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

Xin lỗi vì phải copy,để thoi dõi tiến trính nên hơi dài,mong mọi người thông cảm :(

Mình đang tiếp tục,nhưng đến đây thì vướng luôn,loay hoay mãi chưa được

5 dòng code dưới bị lỗi mà mình chưua hiểu tại sao

Nếu đặt (setq temp3 (vl-cmdf....) thì nó dừng hẳn lại bắt mình pick chọn HCN vừa tạo để hatch.

Còn đặt như code bên dưới thì nhận được thông báo không hiểu biến "M" ?? Phải chăng phải tạo list lưu các đối tượng tp3,tp4 trước khi copy,chứ không gọi được trực tiếp?Mong mọi người giúp đỡ

(defun C:dvc (/ GOC1 dx dy temp-1 temp-2 GOC2 TAM temp3 temp4)
 (setq GOC1 (getpoint "\nDiem dat.: ")
dx	 (getdist "\nChieu dai canh theo truc x: ")
dy	 (getdist "\nChieu dai canh theo theo truc y: ")
GOC2	 (list (+ (car GOC1) dx) (+ (cadr GOC1) dy) 0)
TAM	 (list (+ (car GOC1) (/ dx 2)) (+ (cadr GOC1) (/ dy 2)) 0)
)
(taolayer "KCVN-CAT" "30" "0.3")
(setvar "clayer" "KCVN-CAT")
 (vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2)
 (setq temp3 (entlast))
 (vl-cmdf "hatch" "ansi31" "10" temp3 "")
 (setq temp4 (entlast))
 (vl-cmdf  "_.copy" temp3 temp4 "" "m" TAM pause)
  )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Taolayer(layr_name color lw / tbl t1 t2 key)
(setvar "Cmdecho" 0)
  (setq tbl(tblnext "LAYER" 1));khoi tao bien
  (while tbl
  (setq t1(strcase layr_name) t2 (cdr(car(cdr tbl))) )
  (if (equal t1 t2) (setq key 1));kiem tra ten layer co ton tai
  (setq tbl(tblnext "LAYER"))
  )  
  (if(/= key 1)
  (progn (setq tbl NIL );giai phong bien
	 (command "_.LAYER" "N" layr_name "C" color layr_name "LW" lw layr_name "" )
		   )
  )
  (setq layr_name NIL);giai phong bien
  (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

Bạn nên chuyển topic thành bài tập thực hành lập trình lsp thì hay hơn đấy. Vì đây là đường lối của 1 lsp mà. Cách suy nghĩ ra sao, cách thực hiện thế nào? Và kết quả là mình đạt đượ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
Xin lỗi vì phải copy,để thoi dõi tiến trính nên hơi dài,mong mọi người thông cảm :(

Mình đang tiếp tục,nhưng đến đây thì vướng luôn,loay hoay mãi chưa được

5 dòng code dưới bị lỗi mà mình chưua hiểu tại sao

Nếu đặt (setq temp3 (vl-cmdf....) thì nó dừng hẳn lại bắt mình pick chọn HCN vừa tạo để hatch.

Còn đặt như code bên dưới thì nhận được thông báo không hiểu biến "M" ?? Phải chăng phải tạo list lưu các đối tượng tp3,tp4 trước khi copy,chứ không gọi được trực tiếp?Mong mọi người giúp đỡ

....

Bạn sửa đoạn này

....

(setq temp3 (entlast));2

(vl-cmdf "hatch" "ansi31" "10" tp3 "");3

(setq temp4 (entlast));4

(vl-cmdf "_.copy" temp3 temp4 "" "m" TAM pause);5

...

thành

...

(setq copy_objs (ssadd))

(ssadd (setq temp3 (entlast)) copy_objs)

(command "-hatch" "P" "ansi31" "10" "0.0" "S" temp3 "")

(ssadd (entlast) copy_objs)

(vl-cmdf "_.copy" copy_objs "" "m" TAM pause);5

...

xem sao

Chỉnh sửa theo master_worse
  • 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
Xin lỗi vì phải copy,để thoi dõi tiến trính nên hơi dài,mong mọi người thông cảm :(

Mình đang tiếp tục,nhưng đến đây thì vướng luôn,loay hoay mãi chưa được

5 dòng code dưới bị lỗi mà mình chưua hiểu tại sao

Nếu đặt (setq temp3 (vl-cmdf....) thì nó dừng hẳn lại bắt mình pick chọn HCN vừa tạo để hatch.

Còn đặt như code bên dưới thì nhận được thông báo không hiểu biến "M" ?? Phải chăng phải tạo list lưu các đối tượng tp3,tp4 trước khi copy,chứ không gọi được trực tiếp?Mong mọi người giúp đỡ

(defun C:dvc (/ GOC1 dx dy temp-1 temp-2 GOC2 TAM temp3 temp4)
 (setq GOC1 (getpoint "\nDiem dat.: ")
dx	 (getdist "\nChieu dai canh theo truc x: ")
dy	 (getdist "\nChieu dai canh theo theo truc y: ")
GOC2	 (list (+ (car GOC1) dx) (+ (cadr GOC1) dy) 0)
TAM	 (list (+ (car GOC1) (/ dx 2)) (+ (cadr GOC1) (/ dy 2)) 0)
)
(taolayer "KCVN-CAT" "30" "0.3")
(setvar "clayer" "KCVN-CAT")
 (vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2);1
 (setq temp3 (entlast));2
 (vl-cmdf "hatch" "ansi31" "10" tp3 "");3
 (setq temp4 (entlast));4
 (vl-cmdf  "_.copy" temp3 temp4 "" "m" TAM pause);5
  )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Taolayer(layr_name color lw / tbl t1 t2 key)
(setvar "Cmdecho" 0)
  (setq tbl(tblnext "LAYER" 1));khoi tao bien
  (while tbl
  (setq t1(strcase layr_name) t2 (cdr(car(cdr tbl))) )
  (if (equal t1 t2) (setq key 1));kiem tra ten layer co ton tai
  (setq tbl(tblnext "LAYER"))
  )  
  (if(/= key 1)
  (progn (setq tbl NIL );giai phong bien
	 (command "_.LAYER" "N" layr_name "C" color layr_name "LW" lw layr_name "" )
		   )
  )
  (setq layr_name NIL);giai phong bien
  (princ)
)

Với lisp thứ nhất Bạn sai đoạn code đặt biến. Bạn gán biến entlast cho temp3 lúc lấy lại bạn lại dùng tmp3. Bạn xem lại xem. Mình dùng điện thoại nên không trả lời kỹ hơn được bạn thông cảm nhé. Hì hì minh đang đi họp.

  • 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 sửa đoạn này

....

(setq temp3 (entlast));2

(vl-cmdf "hatch" "ansi31" "10" tp3 "");3

(setq temp4 (entlast));4

(vl-cmdf "_.copy" temp3 temp4 "" "m" TAM pause);5

...

thành

...

(setq copy_objs (ssadd))

(ssadd (setq temp3 (entlast)) copy_objs)

(command "-hatch" "P" "ansi31" "10" "0.0" "S" temp3 "")[/size]

(ssadd (entlast) copy_objs)

(vl-cmdf "_.copy" copy_objs "" "m" TAM pause);5

...

xem sao

==>

(defun C:dvc (/ GOC1 dx dy temp-1 temp-2 GOC2 TAM temp3 temp4)
 (setq GOC1 (getpoint "\nDiem dat.: ")
dx	 (getdist "\nChieu dai canh theo truc x: ")
dy	 (getdist "\nChieu dai canh theo theo truc y: ")
GOC2	 (list (+ (car GOC1) dx) (+ (cadr GOC1) dy) 0)
TAM	 (list (+ (car GOC1) (/ dx 2)) (+ (cadr GOC1) (/ dy 2)) 0)
)
(taolayer "KCVN-CAT" "30" "0.3")
(setvar "clayer" "KCVN-CAT")
 (vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2)
(setq copy_objs (ssadd))
(ssadd (setq temp3 (entlast)) copy_objs)
(command "-hatch" "P" "ansi31" "10" "0.0" "S" temp3 "")
(ssadd (entlast) copy_objs)
(vl-cmdf "_.copy" copy_objs "" TAM pause);5
  )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Taolayer(layr_name color lw / tbl t1 t2 key)
(setvar "Cmdecho" 0)
  (setq tbl(tblnext "LAYER" 1));khoi tao bien
  (while tbl
  (setq t1(strcase layr_name) t2 (cdr(car(cdr tbl))) )
  (if (equal t1 t2) (setq key 1));kiem tra ten layer co ton tai
  (setq tbl(tblnext "LAYER"))
  )  
  (if(/= key 1)
  (progn (setq tbl NIL );giai phong bien
	 (command "_.LAYER" "N" layr_name "C" color layr_name "LW" lw layr_name "" )
		   )
  )
  (setq layr_name NIL);giai phong bien
  (princ)
)

Mình đã sửa như vậy,nhưng vẫn gặp lỗi :

Diem dat.:
Chieu dai canh theo truc x:  Specify second point:
Chieu dai canh theo theo truc y:  Specify second point:
2D point or option keyword required.

2D point or option keyword required.
Unknown command "M".  Press F1 for help.
*Cancel*
nil

Cho mình hỏi cách gán đt ở dòng màu vàng có gì khác với ban đầu,bạn giải thích giùm mình với nhé :">

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 có vấn đề này, các bác xem chỉ giúp cho em nhé!

em muốn lọc đối tượng trong nhóm đối tượng đã chọn trước thì làm ntn?

VD: (setq dt1(ssget));đây là nhóm dt đã chọn trước

bgiờ em muốn (setq dt2 (...(0 . "line"))); đây là nhóm dt2 gồm những line trong nhóm dt1.

xin chỉ em cú pháp thế nào nha! :(

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 có vấn đề này, các bác xem chỉ giúp cho em nhé!

em muốn lọc đối tượng trong nhóm đối tượng đã chọn trước thì làm ntn?

VD: (setq dt1(ssget));đây là nhóm dt đã chọn trước

bgiờ em muốn (setq dt2 (...(0 . "line"))); đây là nhóm dt2 gồm những line trong nhóm dt1.

xin chỉ em cú pháp thế nào nha! :(

 

Lọc thì có nhiều cách

Bạn muốn tham khảo thì vô Visual Lisp hay AutoCad bấm phím F1 và tìm cú pháp ssget

Ví dụ như thế này

 

(setq layer (cdr (asoc 8 (entget (car (entsel)))

(setq ss (ssget "X"

(list (cons 0 "ACAD_PROXY_ENTITY") (cons 8 layer))

)

)

 

 

hay là xài kiểu này

 

(setq KL1 (ssget "X"

'((0 . "TEXT")

(-4 . "

(8 . "KHOILUONG")

(8 . "NETPHU")

(-4 . "OR>")

)

)

)

 

còn nếu bạn muốn lọc các đối tưọng dt2 là LINE có trong dt1 đã chon trước thì xài câu lệnh này

 

(setq i -1)
(setq dt2 (ssadd))
(repeat	(sslength dt1)
 (setq i (+ i 1))
 (setq ent (ssname dt1 i))
 (setq ents (entget ent))
 (setq name (cdr (assoc 0 ents)))
 (if (= name "LINE")
   (setq ss1 (ssadd ent dt2))
 )
)

  • 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ì.Thực ra lúc đầu mình set hết là tp3,tp4 trong code.Nhưng đến lúc copy post lên thì lại nghĩ nó không thống nhất với cách đặt temp1,2 từ đầu,mọi ng khó theo dõi,nên chỉnh lại cho đẹp,nhưng lại quên chỗ dòng lệnh.^^Mình sửa lại cho khớp rồi.Lỗi vẫn như thế

Mình sửa cho bạn rồi này. Bạn tự nghiên cứu xem mình sai chỗ nào nhé. Có gì thắc mắc thì tiếp tục reply

;; free lisp from cadviet.com
(defun C:dvc (/ GOC1 dx dy temp-1 temp-2 GOC2 TAM temp3 temp4)
  (setq dx     (getdist "\nChieu dai canh theo truc x: ")
    dy     (getdist "\nChieu dai canh theo theo truc y: ")
   GOC1 (getpoint "\nDiem dat.: ")
    GOC2     (list (+ (car GOC1) dx) (+ (cadr GOC1) dy) 0)
    TAM     (list (+ (car GOC1) (/ dx 2)) (+ (cadr GOC1) (/ dy 2)) 0)
    )
(taolayer "KCVN-CAT" "30" "0.3")
(setvar "clayer" "KCVN-CAT")
  (vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2);1
  (setq temp3 (entlast));2
  (vl-cmdf "hatch" "ansi31" "200" "" temp3 "");3
  (setq temp4 (entlast));4
  (vl-cmdf  "_.copy" temp3 temp4 "" "m" TAM pause);5
   )

  • 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
em có vấn đề này, các bác xem chỉ giúp cho em nhé!

em muốn lọc đối tượng trong nhóm đối tượng đã chọn trước thì làm ntn?

VD: (setq dt1(ssget));đây là nhóm dt đã chọn trước

bgiờ em muốn (setq dt2 (...(0 . "line"))); đây là nhóm dt2 gồm những line trong nhóm dt1.

xin chỉ em cú pháp thế nào nha! :(

Mình có cách này đơn giản hơn nhiều

(setq ss (ssget))

(setq ssl (ssget "p" '((0 . "line"))))

tập đối tượng ssl chứa đối tượng line.

  • 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
Mình có cách này đơn giản hơn nhiều

(setq ss (ssget))

(setq ssl (ssget "p" '((0 . "line"))))

tập đối tượng ssl chứa đối tượng line.

CẢM ơn các bác. dể em làm thử doạn code cua bac vuvuzela. còn doạn code của bác phamngoctukts là chọn lại đối tượng vừa chọn (ssget "p"). nhưng em làm trong lisp thì chọn nhiều nhóm khác nhau ko xài dc bác ah. Thanks tất 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ẢM ơn các bác. dể em làm thử doạn code cua bac vuvuzela. còn doạn code của bác phamngoctukts là chọn lại đối tượng vừa chọn (ssget "p"). nhưng em làm trong lisp thì chọn nhiều nhóm khác nhau ko xài dc bác ah. Thanks tất cả!

Muốn chọn tập đối tượng ss sau khi đã làm nhiều bước bạn chỉ cần làm thế này (command "select" ss "") sau đó dùng (setq ssl (ssget "p" '((0 . "line")))) bình thường. Do đoạn code kia dài quá khó kiểm soát khi viết lisp thôi. Chúc bạn vui. Do

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 có thể giúp mình 1 cái tut về sử dụng các hàm ssget, entmake, subst, entmod, while với.

 

Vídu: Chọn 1 vùng rồi lọc text chẳng hạn, nhập chiều cao mới của text , dùng các hàm trên để sửa chiều cao của nó theo chiều cao vừa nhập.

 

Cách dùng các hàm trong líp này ra sao, có tác dụng gì.. Thank 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
Cho mình hỏi cách gán đt ở dòng màu vàng có gì khác với ban đầu,bạn giải thích giùm mình với nhé :">

do thói quen thôi.

------

sửa dòng này chắc là được

(command "-hatch" "P" "ansi31" "10" "0.0" "S" temp3 "" "")

chưa có máy test nhưng đủ dấu chắc lệnh hatch hết lỗ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 có thể giúp mình 1 cái tut về sử dụng các hàm ssget, entmake, subst, entmod, while với.

 

Vídu: Chọn 1 vùng rồi lọc text chẳng hạn, nhập chiều cao mới của text , dùng các hàm trên để sửa chiều cao của nó theo chiều cao vừa nhập.

 

Cách dùng các hàm trong líp này ra sao, có tác dụng gì.. Thank nhiều...

Vídu:
(defun c:vidu (/ txt newhig i)
(setq ss (ssget '((0 . "text"))))
(setq newhig (getreal "\nNhap chieu cao chu: "))
(setq i 0)
(while (< i (sslength ss))
 (setq txt (ssname ss i))
 (entmod (subst (cons 40 newhig) (assoc 40 (entget txt)) (entget txt)))
 (setq i (1+ i))
);_ end while
);_ end defun

  • 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
Mình sửa cho bạn rồi này. Bạn tự nghiên cứu xem mình sai chỗ nào nhé. Có gì thắc mắc thì tiếp tục reply

;; free lisp from cadviet.com
(defun C:dvc (/ GOC1 dx dy temp-1 temp-2 GOC2 TAM temp3 temp4)
  (setq dx     (getdist "\nChieu dai canh theo truc x: ")
    dy     (getdist "\nChieu dai canh theo theo truc y: ")
   GOC1 (getpoint "\nDiem dat.: ")
    GOC2     (list (+ (car GOC1) dx) (+ (cadr GOC1) dy) 0)
    TAM     (list (+ (car GOC1) (/ dx 2)) (+ (cadr GOC1) (/ dy 2)) 0)
    )
(taolayer "KCVN-CAT" "30" "0.3")
(setvar "clayer" "KCVN-CAT")
  (vl-cmdf "._RECTANGLE" "_non" GOC1 "D" dx dy "_non" GOC2);1
  (setq temp3 (entlast));2
  (vl-cmdf "hatch" "ansi31" "200" "" temp3 "");3
  (setq temp4 (entlast));4
  (vl-cmdf  "_.copy" temp3 temp4 "" "m" TAM pause);5
   )

Ôi,hóa ra mình thiếu 1 dấu "".Hức..Mình chưa bết cần bao nhiêu đối số cho lệnh h :(

Còn dòng 5,mình thấy vẫn nguyên,n lại giải quyết được lỗi Unknown M command.Phải chăng lỗi này là do hệ lụy của dòng 3 lúc trước chưa chuẩn?

Nhờ mọi người hướng dẫn mình cách move 1 đối tượng theo trục,và cách đặt chân dim cách đối tượng 1 khoảng cố định cho trước 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
do thói quen thôi.

------

sửa dòng này chắc là được

(command "-hatch" "P" "ansi31" "10" "0.0" "S" temp3 "" "")

chưa có máy test nhưng đủ dấu chắc lệnh hatch hết lỗi

Đúng là đã fix lỗi,cách của bác dùng -h nên kiểm tra lại theo dòng lệnh từng bước chuẩn luôn ^^.Mình ngố quá :|

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
Ôi,hóa ra mình thiếu 1 dấu "".Hức..Mình chưa bết cần bao nhiêu đối số cho lệnh h :(

Còn dòng 5,mình thấy vẫn nguyên,n lại giải quyết được lỗi Unknown M command.Phải chăng lỗi này là do hệ lụy của dòng 3 lúc trước chưa chuẩn?

Nhờ mọi người hướng dẫn mình cách move 1 đối tượng theo trục,và cách đặt chân dim cách đối tượng 1 khoảng cố định cho trước với

- Cách kiểm tra command đã đủ chưa bạn chỉ cần copy đoạn command đố paste vào dòng command của cad. Nếu nó thiếu cái gì thì bổ xung cái đó.

- Ý thứ hai của bạn thì dùng phàm polar ví dụ (setq p2 (polar p1 ang kc)) p2 là điểm cần xác định, p1 là điểm có sẵn, ang là góc tạo bởi đường thẳng p1 p2 với trục x đo bằng radian kc là khoảng cách từ điểm p1 đến điểm p2.

từ ví dụ trên nếu bạn muốn move theo trục x thì bạn chỉ cần đặt góc ang = 0 và kc là khoảng cách muốn move. Chúc bạn thành cô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

Hi.Tks bạn.Cái này đúng là do mình lười suy nghĩ quá,biết là có hàm đó rồi mà chưa biết tận dụng ^^.

Sáng nay mình cũng đã thử cách đặt dim đúng quy cách trong ví dụ.

Cách đầu là mình sẽ dim cạnh CN,đặt chiều dài chân dim 2mm.Lúc này dim dính vào cạnh HCN-->rồi dùng move với polar để đẩy dim ra khỏi đối tượng 3mm nữa

Cách 2 là mình nghĩ có đối số đặt chân dim cách đối tượng 1 khoảng cố định luôn,nhưng chưa rõ phải làm 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

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

×