Đến nội dung


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

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


  • Please log in to reply
171 replies to this topic

#1 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:03 PM

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
Hình đã gửi
  • 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


#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:08 PM

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


  • 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


#3 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:09 PM

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


#4 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:11 PM

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


  • 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


#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:12 PM

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


#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:13 PM

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


#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:16 PM

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 ạ


  • 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


#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 September 2010 - 11:25 PM

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)
)

  • 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


#9 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 21 September 2010 - 08:56 AM

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.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#10 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 21 September 2010 - 10:15 AM

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

Bài viết đã được chỉnh sửa nội dung bởi master_worse: 21 September 2010 - 11:50 AM

  • 1

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#11 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 September 2010 - 11:15 AM

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

#12 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 September 2010 - 01:18 PM

....
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é :">
  • 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


#13 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 21 September 2010 - 01:29 PM

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! :(
  • 0
Hình đã gửi

#14 VUVUZELA

VUVUZELA

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 210 Bài viết
Điểm đánh giá: 97 (tàm tạm)

Đã gửi 21 September 2010 - 02:33 PM

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))
)
)

  • 1

Hệ thống Liên Kết, Thiết Kế Tự Động

ttps://www.facebook...etThietKeTuDong


#15 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 September 2010 - 03:09 PM

Á,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
   )

  • 1
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!

#16 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 September 2010 - 03:17 PM

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

#17 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 21 September 2010 - 03:38 PM

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ả!
  • 0
Hình đã gửi

#18 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 September 2010 - 04:00 PM

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

#19 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 21 September 2010 - 04:10 PM

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

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#20 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 21 September 2010 - 04:38 PM

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

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)