Đến nội dung


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

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#2721 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

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

Các bạn nên xây dựng các hàm tạo đối tuợng như thế này để tránh những rắc rối mà hàm command tạo ra.

(defun MakeLayer (name color linetype lineWeight plot xdata)
(entmake (list '(0 . "LAYER")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 name)
(cons 70 0)
(cons 62 (if color color 7))
(cons 6 (if linetype linetype "Continuous"))
(cons 290 (if plot 1 0))
(cons 370 (if lineWeight (fix (* 100 lineWeight)) -3))
(cons -3 (if xdata (list xdata) nil))))
(tblobjname "layer" name))

Thank bạn! Nhưng với nhiều đối tượng phức tạp thì dùng command để tạo đối tượng mình thấy ngắn hơn. Với lại các thông số dxf để tạo đối tượng cần bao nhiêu thì đủ và dùng những mã nào mình cũng không nắm rõ. Ví dụ như tạo text mình dùng các mã 0, 1, 10, 40, 72 để taok mà nó không ra.
  • 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!

#2722 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:54 AM

Thank bạn! Nhưng với nhiều đối tượng phức tạp thì dùng command để tạo đối tượng mình thấy ngắn hơn. Với lại các thông số dxf để tạo đối tượng cần bao nhiêu thì đủ và dùng những mã nào mình cũng không nắm rõ. Ví dụ như tạo text mình dùng các mã 0, 1, 10, 40, 72 để taok mà nó không ra.

Vẽ đối tượng bằng hàm command luôn phải chịu ảnh hưởng rất nhiều từ các biến hệ thống. Biến osmode là ví dụ điển hình. thêm nữa là hàm command tạo đối tượng tương đối chậm, và nếu với 1 lisp tạo ra 1 số lượng lớn đối tượng từ hàm command, khi undo lại thì ngồi chờ cổ dài bằng hươu luôn. <_<
Với text thì bạn sử dụng hàm này.
(defun MakeText (point string Height Ang justify Style Layer Color xdata / Lst)
(setq Lst (list '(0 . "TEXT")
(cons 8 (if Layer Layer (getvar "Clayer")))
(cons 62 (if Color Color 256))
(cons 10 point)
(cons 40 Height)
(cons 1 string)
(cons 50 (if Ang (* pi (/ Ang 180)) 0))
(cons 7 (if Style Style (getvar "Textstyle")))
(cons -3 (if xdata (list xdata) nil)))
justify (strcase justify))
(cond ((= justify "C") (setq Lst (append Lst (list (cons 72 1) (cons 11 point)))))
((= justify "R") (setq Lst (append Lst (list (cons 72 2) (cons 11 point)))))
((= justify "M") (setq Lst (append Lst (list (cons 72 4) (cons 11 point)))))
((= justify "TL") (setq Lst (append Lst (list (cons 72 0) (cons 11 point) (cons 73 3)))))
((= justify "TC") (setq Lst (append Lst (list (cons 72 1) (cons 11 point) (cons 73 3)))))
((= justify "TR") (setq Lst (append Lst (list (cons 72 2) (cons 11 point) (cons 73 3)))))
((= justify "ML") (setq Lst (append Lst (list (cons 72 0) (cons 11 point) (cons 73 2)))))
((= justify "MC") (setq Lst (append Lst (list (cons 72 1) (cons 11 point) (cons 73 2)))))
((= justify "MR") (setq Lst (append Lst (list (cons 72 2) (cons 11 point) (cons 73 2)))))
((= justify "BL") (setq Lst (append Lst (list (cons 72 0) (cons 11 point) (cons 73 1)))))
((= justify "BC") (setq Lst (append Lst (list (cons 72 1) (cons 11 point) (cons 73 1)))))
((= justify "BR") (setq Lst (append Lst (list (cons 72 2) (cons 11 point) (cons 73 1))))))
(entmake Lst)
(entlast))
PS: ngắn hay dài, điều đó tùy vào nhu cầu và thói quen của từng người khi viết code thôi. chẳng hạn với code trên, với nhu cầu thông thường thì có thể rút ngắn số lượng biến của nó còn lại 3 biến: point, string, và height
  • 2

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


#2723 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 November 2010 - 08:00 AM

Thank bạn! Nhưng với nhiều đối tượng phức tạp thì dùng command để tạo đối tượng mình thấy ngắn hơn. Với lại các thông số dxf để tạo đối tượng cần bao nhiêu thì đủ và dùng những mã nào mình cũng không nắm rõ. Ví dụ như tạo text mình dùng các mã 0, 1, 10, 40, 72 để taok mà nó không ra.

Thường phải có thêm Dxf =11 nữa.
Bạn cứ tạo xem. Nếu không được, post lên đây để anh chị em giúp đỡ
  • 1

#2724 DuongTrungHuy

DuongTrungHuy

    biết lệnh copy

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

Đã gửi 27 November 2010 - 09:01 AM

Thank bạn! Nhưng với nhiều đối tượng phức tạp thì dùng command để tạo đối tượng mình thấy ngắn hơn. Với lại các thông số dxf để tạo đối tượng cần bao nhiêu thì đủ và dùng những mã nào mình cũng không nắm rõ. Ví dụ như tạo text mình dùng các mã 0, 1, 10, 40, 72 để taok mà nó không ra.

Bạn cũng có thể mò như sau:
- Dùng Entget để lấy dữ liệu của dối tượng TEXT (là 1 LIST)
- Dùng Entmake để tạo đối tượng ứng với LIST đó
- lược bỏ dần những list con không cần thiết bằng cách xóa list con đó mà vẫn tạo được text.
- Cứ như vậy Bạn sẽ có 1 danh sách tối thiểu để tạo TEXT.

(Có thể tương ứng với từng máy. Như máy Mình đang dùng thì chỉ cần 0 10 40 1. Bạn chú ý hình như phải sắp đặt theo thứ tự cái trước cái sau, ví dụ 0 phải là đầu tiên
- (entmake (list (cons 0 "TEXT")(cons 10 (list 100 100))(cons 40 1.2)(cons 1 "Ví dụ 1"))) được
- (entmake (list (cons 40 1.2) (cons 0 "TEXT") (cons 10 (list 100 100))(cons 1 "Ví dụ 2"))) không được
)
  • 1

#2725 lacvanhoa

lacvanhoa

    biết vẽ line

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

Đã gửi 27 November 2010 - 10:14 AM

các bác biết chỉ dùm mình với sau mình sử dụng ỨNG DỤNG CỦA AUTOCAD.NET API cho phép trích xuất text trong bản vẽ ra file exel tren cad 2007 không được vậy http://www.cadviet.c...tetoexcel_1.zip
Sao không ai chịu giúp mình hết vậy, thật là buồn quá đi hu hu hu
  • 0

#2726 hugo007

hugo007

    biết lệnh erase

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

Đã gửi 27 November 2010 - 10:34 AM

Em đang tìm hiểu về lisp.Khi muốn viết lisp gọi lệnh trong cad bằng dòng COMMAND thì được nhưng viết để gọi lệnh DIMSTYLE không được.Mong các bác chỉ giùm.Thanks
(defun c:dd() (command "dimstyle"))
  • 0

#2727 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 27 November 2010 - 12:24 PM

Em đang tìm hiểu về lisp.Khi muốn viết lisp gọi lệnh trong cad bằng dòng COMMAND thì được nhưng viết để gọi lệnh DIMSTYLE không được.Mong các bác chỉ giùm.Thanks
(defun c:dd() (command "dimstyle"))

Thường thì khi muốn gọi dialog box thì thêm (initdia). ví dụ muốn gọi dialog layer thì dùng (initdia)(command "layer") nhưng không hiểu sao với dímtyle thì không gọi được. Nếu bạn muốn gọi dialog dímtyle thì dùng (command "ddim") thì nó lên luôn.
  • 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!

#2728 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 27 November 2010 - 01:29 PM

Cac bác ơi cho em hỏi một tý, sao em dung cái này trong cad 2007 không được vậy http://www.cadviet.c...ritetoexcel.zip sau khi em NETLOAD xong em đánh lệnh toex thì cad báo (Exception has been throw by tayet an invocation) em ấn continue thì nó thoát lệnh luôn

các bác biết chỉ dùm mình với sau mình sử dụng ỨNG DỤNG CỦA AUTOCAD.NET API cho phép trích xuất text trong bản vẽ ra file exel tren cad 2007 không được vậy http://www.cadviet.c...tetoexcel_1.zip
Sao không ai chịu giúp mình hết vậy, thật là buồn quá đi hu hu hu

Chào lacvanhoa.
Cần phải có thời gian mới trả lời bạn được. (vì hôm qua trên cơ quan sài Cad 2010)
Sáng nay mới chạy trên Cad 2007 kết quả OK.
Có khả năng do Win của bạn sử dụng .Net Framework 2.0 ?
thử nâng cấp .Net Framework lên version 3.5.

Không thể trì hoãn cái sự sung sướng được.
  • 0

#2729 hugo007

hugo007

    biết lệnh erase

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

Đã gửi 27 November 2010 - 05:16 PM

Thường thì khi muốn gọi dialog box thì thêm (initdia). ví dụ muốn gọi dialog layer thì dùng (initdia)(command "layer") nhưng không hiểu sao với dímtyle thì không gọi được. Nếu bạn muốn gọi dialog dímtyle thì dùng (command "ddim") thì nó lên luôn.

Cảm ơn bạn rất nhiều,vì vấn đề này mình thắc mắc rất nhiều mà không ai giải đáp được.Bạn làm cách nào mà tìm ra được vậy?Tiện thể cho mình hỏi muốn gọi lệnh DDPTYPE thì bằng cách nào?Vì dùnng (command "DDPTYPE") không gọi được.Thanks.
  • 0

#2730 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 November 2010 - 05:24 PM

Cảm ơn bạn rất nhiều,vì vấn đề này mình thắc mắc rất nhiều mà không ai giải đáp được.Bạn làm cách nào mà tìm ra được vậy? Tiện thể cho mình hỏi muốn gọi lệnh DDPTYPE thì bằng cách nào?Vì dùnng (command "DDPTYPE") không gọi được.Thanks.

Vấn đề này, Tue_NV đã giải đáp lâu rồi mà.
Bai viet so 1649 :cheers:
Bạn xem thêm ví dụ mẫu ở bài viết 1654 nhé
Topic này trôi qua nhanh quá.
:leluoi:
Bạn muốn gọi hộp thoại DDPTYPE à?
  • 1

#2731 hugo007

hugo007

    biết lệnh erase

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

Đã gửi 27 November 2010 - 06:15 PM

Vấn đề này, Tue_NV đã giải đáp lâu rồi mà.
Bai viet so 1649 :cheers:
Bạn xem thêm ví dụ mẫu ở bài viết 1654 nhé
Topic này trôi qua nhanh quá.
:leluoi:
Bạn muốn gọi hộp thoại DDPTYPE à?

Cảm ơn 2 bác rất nhiều,nhân tiện cho e hỏi sao dùng (command "cal") và (command "overkill") không được?Thanks.
  • 0

#2732 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 27 November 2010 - 06:54 PM

Cảm ơn 2 bác rất nhiều,nhân tiện cho e hỏi sao dùng (command "cal") và (command "overkill") không được?Thanks.

lệnh (command "cal") dùng bình thường mà bạn, còn lện overkill thì bạn dùng (c:overkill)
  • 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!

#2733 hugo007

hugo007

    biết lệnh erase

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

Đã gửi 27 November 2010 - 08:00 PM

lệnh (command "cal") dùng bình thường mà bạn, còn lện overkill thì bạn dùng (c:overkill)

Nếu dùng bình thường thì được nhưng khi ta vẽ 1 đường thẳng rồi dùng lệnh stretch để kéo đoạn thẳng dài ra 1 đoạn thí dụ 'cal rồi nhấn 33x7.5 thì nó báo lỗi:
Invalid point.
; error: Function cancelled

Cảm ơn bạn rất nhiều.
  • 0

#2734 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 27 November 2010 - 09:15 PM

Nếu dùng bình thường thì được nhưng khi ta vẽ 1 đường thẳng rồi dùng lệnh stretch để kéo đoạn thẳng dài ra 1 đoạn thí dụ 'cal rồi nhấn 33x7.5 thì nó báo lỗi:
Invalid point.
; error: Function cancelled

Cảm ơn bạn rất nhiều.

Bạn dùng cad version bao nhiêu. Mình dùng cad 2007 vẫn bình thường trả gặp lỗi gì.
  • 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!

#2735 hugo007

hugo007

    biết lệnh erase

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

Đã gửi 27 November 2010 - 09:43 PM

Bạn dùng cad version bao nhiêu. Mình dùng cad 2007 vẫn bình thường trả gặp lỗi gì.

Version 11.Bạn có dùng kết hợp với stretch và scale.... không?Nhưng nếu sử dụng trong Express thì được.Thanks.
  • 0

#2736 lacvanhoa

lacvanhoa

    biết vẽ line

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

Đã gửi 27 November 2010 - 10:51 PM

Em cám ơn bác gia bạch nhiều nhe!!!
  • 0

#2737 lacvanhoa

lacvanhoa

    biết vẽ line

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

Đã gửi 27 November 2010 - 11:43 PM

Em mới tham gia diễn đàn gần đây thôi em thấy rất hay rất có ích cho bản thân em giúp em rất nhiều trong công việc kiến thức cad của em được cải thiện rất rõ.
em nói vòng vòng để mong được sự giúp đỡ của các bác trên đàn đó hê hê! em muốn thỉnh giáo các bác vấn đề này đây
http://www.cadviet.c...iles/3/to44.dwg
  • 0

#2738 vietha209

vietha209

    biết zoom

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

Đã gửi 28 November 2010 - 01:09 AM

Các bạn xem hộ mình đoạn lisp này mình viết sai ở đâu mà đường tròn lúc thì tạo ra đúng lúc lại tạo ra sai (đặc biệt là có khi cùng một đoạn thẳng) bắt đi bắt lại một lúc lại sai??? Giúp mình nhé.
  (defun c:ccc ()
(setq oldos (getvar "OSMODE"))
(setq oldot (getvar "ORTHOMODE"))
(setvar "OSMODE" 3)
(setvar "ORTHOMODE" 0)
(setvar "cmdecho" 0)
(setq P1 (getpoint "\n Pick diem dau: "))
(setq P2 (getpoint P1 "\n Pick diem cuoi: "))

(if (< (cadr P1) (cadr P2))
(progn (setq P0 P1) (setq goc (angle P1 P2)))
(progn (setq P0 P2) (setq goc (angle P2 P1)))
)

(setq X1 (car P1)
Y1 (cadr P1)
)
(setq X2 (car P2)
Y2 (cadr P2)
)

(setq P3 (list (/ (+ X1 X2) 2) (/ (+ Y1 Y2) 2) 0))

(setq L (abs (- X1 X2)))
(setq H (abs (- Y1 Y2)))
(setq i (rtos (* (/ H L) 100) 2 2))
(setq doc (/ (* goc 180) pi))
(if (< doc 90)
(progn
(setq P4 (polar P3 (+ goc (/ pi 2)) 0.5))
;(prompt "\n nho hon 90d")
)
(progn
(setq P4 (polar P3 (- goc (/ pi 2)) 0.5))
(setq doc (- doc 180))
;(prompt "\n lon hon 90d")
)
)
(command ".circle" P4 0.5)

(setvar "OSMODE" oldos)
(setvar "ORTHOMODE" oldot)
(princ)
)


link bản vẽ http://www.cadviet.c...drawing1_35.dwg
  • 0

#2739 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 28 November 2010 - 01:54 AM

Các bạn xem hộ mình đoạn lisp này mình viết sai ở đâu mà đường tròn lúc thì tạo ra đúng lúc lại tạo ra sai (đặc biệt là có khi cùng một đoạn thẳng) bắt đi bắt lại một lúc lại sai??? Giúp mình nhé.

  (defun c:ccc ()
(setq oldos (getvar "OSMODE"))
(setq oldot (getvar "ORTHOMODE"))
(setvar "OSMODE" 3)
(setvar "ORTHOMODE" 0)
(setvar "cmdecho" 0)
(setq P1 (getpoint "\n Pick diem dau: "))
(setq P2 (getpoint P1 "\n Pick diem cuoi: "))

(if (< (cadr P1) (cadr P2))
(progn (setq P0 P1) (setq goc (angle P1 P2)))
(progn (setq P0 P2) (setq goc (angle P2 P1)))
)

(setq X1 (car P1)
Y1 (cadr P1)
)
(setq X2 (car P2)
Y2 (cadr P2)
)

(setq P3 (list (/ (+ X1 X2) 2) (/ (+ Y1 Y2) 2) 0))

(setq L (abs (- X1 X2)))
(setq H (abs (- Y1 Y2)))
(setq i (rtos (* (/ H L) 100) 2 2))
(setq doc (/ (* goc 180) pi))
(if (< doc 90)
(progn
(setq P4 (polar P3 (+ goc (/ pi 2)) 0.5))
;(prompt "\n nho hon 90d")
)
(progn
(setq P4 (polar P3 (- goc (/ pi 2)) 0.5))
(setq doc (- doc 180))
;(prompt "\n lon hon 90d")
)
)
(command ".circle" P4 0.5)

(setvar "OSMODE" oldos)
(setvar "ORTHOMODE" oldot)
(princ)
)


link bản vẽ http://www.cadviet.c...drawing1_35.dwg

Bạn sửa dòng này (setvar "OSMODE" 3) thành (setvar "OSMODE" 1). Vì (setvar "OSMODE" 3) bắt cả điểm midpoint nên đường tròn nó dính vào điểm giữa của đường thẳng. Nếu không muốn sửa dòng (setvar "OSMODE" 3) thì bạn thêm dòng (setvar "OSMODE" 0) sau dòng (setq P2 (getpoint P1 "\n Pick diem cuoi: "))
  • 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!

#2740 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 28 November 2010 - 03:33 AM

Em mới tham gia diễn đàn gần đây thôi em thấy rất hay rất có ích cho bản thân em giúp em rất nhiều trong công việc kiến thức cad của em được cải thiện rất rõ.
em nói vòng vòng để mong được sự giúp đỡ của các bác trên đàn đó hê hê! em muốn thỉnh giáo các bác vấn đề này đây
http://www.cadviet.c...iles/3/to44.dwg

Bạn yêu cầu gì mà khoai thế. Mình viết cho bạn được thế này bạn test thử và cho ý kiến để hoàn thiện

(defun c:cthua ()
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(while (setq p (getpoint "\nPick vao vi tri thua muon trich do: "))
(command "boundary" p "")
(command "area" "o" (setq el1 (entlast)))
(setq of (/ (sqrt (getvar "area")) 6))
(setq ranp (car (acet-geom-vertex-list el1)))
(setq pout (polar p (angle p ranp) (+ (distance p ranp) of)))
(command "offset" of el1 pout "")
(setq el2 (entlast))
(acet-ss-zoom-extents (acet-list-to-ss (list el2)))
(setq lsp (acet-geom-vertex-list el2))
(setq ss (ssget "cp" lsp))
(setq ss (ssdel el1 ss))
(setq ss (ssdel el2 ss))
(command "zoom" "p")
(command "copy" ss "" p (setq pm (getpoint "\nPick vao vi tri can chen")) "")
(command "move" el1 el2 "" p pm)
(command "offset" 1 el2 p "")
(setq el3 (entlast))
(setq lsf (acet-geom-vertex-list el3))
(setq i 0)
(command "trim" el2 "" "f")
(repeat (length lsf)
(command (nth i lsf))
(setq i (1+ i))
)
(command "" "")
(entdel el1)
(entdel el2)
(entdel el3)
(setq dk (getstring "\nTrich thua da hoan thanh. ban co muon tiep tuc khong: [Co/Khong]: < Co >: "))
(if (or (= (strcase dk) "C") (= dk "")) (setq p T) (setq p nil))
)
(setvar "osmode" oldos)
)

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