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

#501 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 03 October 2010 - 02:06 AM

1- Lisp không có sẵn các hàm thao tác với hệ hexadecimal, nếu có nhu cầu phải tự xây dựng lấy.
Nếu chỉ giới hạn ở việc chọn entbef (mình thích từ "entback" hơn vì nó opposite với "entnext" hơn) thì trình tự như bạn đã làm là OK rồi. Tuy nhiên, đã tốn công sức vào đó thì nên xây dựng luôn các hàm thao tác với hexadecimal để có cái mà dùng khi cần đến sau này nên mình mới gợi ý như vậy. Cách làm tuỳ mỗi người, thoả sức mà sáng tạo!

2- Góp ý: hàm 16t10 của bạn cho return dạng integer thì hợp lý hơn

3- Trong help có một đoạn code cực hay, convert số decimal sang cơ số khác bất kỳ: nhị, bát, thập lục (thậm chí tam, tứ, ngũ... phân gì đó cũng được tuốt!). Bạn thấy hứng thú thì ngâm cứu và phát triển tiếp theo chiều ngược lại:

Vài ví dụ ssg đã chạy thử (thập lục, nhị và... tam phân!)

Command: (base 16 27)
"1B"

Command: (base 2 7)
"111"

Command: (base 3 7)
"21"

Chào bác SSG,
Dựa trên cái lisp và sư gợi ý của bác mình viết thêm phần đổi ngược một chuỗi ký tự biểu diễn số trong các hệ cơ số đếm khác nhau thành giá tị số nguyên trong hệ thập phân. Nhờ bác và các bác khác kiểm tra lại giùm mình nhé.


; BASE converts from a decimal integer to a string in another base.
(defun BASE ( bas int / ret yyy zot )
(defun zot ( i1 i2 / xxx )
(if (> (setq xxx (rem i2 i1)) 9)
(chr (+ 55 xxx))
(itoa xxx)
)
)
(setq ret (zot bas int) yyy (/ int bas))
(while (>= yyy bas)
(setq ret (strcat (zot bas yyy) ret))
(setq yyy (/ yyy bas))
)
(strcat (zot bas yyy) ret)
)
;; The CON function will convert an expression string in another base to decimal integer value.
(defun con (str bas / n i )
(setq str (strcase str)
n (strlen str)
val 0
i 0 )
(while (> n 0)
(setq ch (substr str n 1))
(if (>= (ascii ch) 65)
(setq val (+ val ( * (expt bas i) (- (ascii ch) 55))))
(setq val (+ val (* (expt bas i) (atoi ch))))
)
(setq i (1+ i)
n (1- n)
)
)
val
)


Code được sửa bởi Phạm Thanh Bình ngày 3/10/2010 theo góp ý của bác Master_Worse và bác SSG.
  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#502 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 October 2010 - 08:14 AM

Chào bác SSG,
Dựa trên cái lisp và sư gợi ý của bác mình viết thêm phần đổi ngược một chuỗi ký tự biểu diễn số trong các hệ cơ số đếm khác nhau thành giá tị số nguyên trong hệ thập phân. Nhờ bác và các bác khác kiểm tra lại giùm mình nhé.

1- Tuyệt lắm bác Bình! Không bõ công bác đã thức đến hơn 2h sáng! :cheers:
Ssg đã chạy thử, OK!

2- Cái calculator của Windows đã có sẵn options chuyển qua lại giữa các hệ đếm 2, 8, 10 và 16. Các bạn có thể dùng để kiểm tra kết quả chạy hàm BASECON:

Hình đã gửi
  • 1

#503 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 03 October 2010 - 08:22 AM

Chào bác SSG,
Dựa trên cái lisp và sư gợi ý của bác mình viết thêm phần đổi ngược một chuỗi ký tự biểu diễn số trong các hệ cơ số đếm khác nhau thành giá tị số nguyên trong hệ thập phân. Nhờ bác và các bác khác kiểm tra lại giùm mình nhé.

Bác sửa dòng này: (setq n (strlen (strcase str))val 0i 0 )
thành: (setq n (strlen (setq str (strcase str))) val 0 i 0 )
là tạm ổn vì (- (ascii "a") 55) = 42 /= (- (ascii "A") 55) = 10
với lại nếu có 1 ký tự không phải là A, B, C, D, E, F thì sao!? - không cần lắm nhưng ...
nếu có thể thì sửa vị trí các đối số lại cho giống hàm base
(defun con (bas str / n i )
  • 2

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)


#504 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 October 2010 - 08:43 AM

1- Bác sửa dòng này: (setq n (strlen (strcase str))val 0i 0 )
thành: (setq n (strlen (setq str (strcase str))) val 0 i 0 )
là tạm ổn vì (- (ascii "a") 55) = 42 /= (- (ascii "A") 55) = 10

2- với lại nếu có 1 ký tự không phải là A, B, C, D, E, F thì sao!? - không cần lắm nhưng ...

3- nếu có thể thì sửa vị trí các đối số lại cho giống hàm base
(defun con (bas str / n i )

Ý kiến ssg thế này:
1- OK! Cám ơn bạn!

2- Không cần, vì chỉ có programmer dùng. Các điều kiện sẽ được "rào" khi họ lập chương trình chính. Trong các functions con, ta cứ giả định rằng các arguments là chính xác -> code sẽ ngắn gọn, rõ ràng hơn.

3- Hoàn toàn nhất trí.
  • 1

#505 ndtnv

ndtnv

    biết lệnh minsert

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

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

Theo hướng dẫn của anh ssg cộng với ý tưởng trong lisp anh Tue_NV, em tự trả lời câu hỏi của mình với lisp sau.

(defun maklis ()
  (setq lis_hex '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F"))
  (setq lis_dec '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15"))
)
(defun DXF (code e) (cdr (assoc code (entget e))))
(defun 16t10 (hex / lis_hex lis_dec L kt S i j)
(maklis)
  (setq L (strlen hex) i L j 0 S 0)
  (Repeat L
    (setq kt (atoi (nth (vl-position (substr hex i 1) lis_hex) lis_dec)))
    (setq S (+ S (* (expt 16 j ) kt)))
    (setq i (1- i))
    (setq j (1+ j))
)
  (itoa S)
)
(defun 10t16 (dec / lis_hex lis_dec hex L dec1 i kt)
(maklis)
  (setq dec (fix dec))
  (setq hex (strcat))
  (setq L (1+ (fix (/ (log dec) (log 16)))) i (1- L) dec1 dec)
  (Repeat L
    (setq kt (nth (vl-position (itoa (fix (/ dec1 (expt 16 i)))) lis_dec) lis_hex))
(setq hex (strcat hex kt))
    (setq dec1 (- dec1 (* (expt 16 i ) (fix (/ dec1 (expt 16 i))))))
    (setq i (1- i))
)
  hex
)
(defun entbef (ena / ena2 han1)
(setq han1 (dxf 5 ena))
(setq ena2 (handent (10t16 (- (atof (16t10 han1)) 1))))
)
(defun C:test ()
(setq ena1 (car (entsel "\nChon doi tuong ban muon lay ename cua doi tuong ke truoc")))
(setq ena_bef (entbef ena1))
(command "erase" ena_bef "")
)

Bước 2- "Tự xây dựng hàm số học để cộng trừ số hexadecimal. Dùng nó để trừ handle nhận được ở trên 1 đơn vị, kết quả bạn nhận được là "C1"." của anh em không làm trực tiếp bên hexadecimal được. Anh có thể viết hàm cộng trừ trực tiếp trên hệ hexadecimal không? Em làm như vậy thì dài dòng và không đúng hướng dẫn của anh thi phải.
Cảm ơn sự nhiệt tình của các anh. Rất vui được học hỏi!


Vài góp ý về lisp của bạn:

Nếu gọi hàm 16t10 hoặc 10t16 mà mỗi lần lại thực hiện (maklis) là không hiệu quả

Không cần lis_dec vì trong hàm 16t10
(vl-position (substr hex i 1) lis_hex)
tương đương với
(atoi (nth (vl-position (substr hex i 1) lis_hex) lis_dec))
và trong hàm 10t16
(nth (fix (/ dec1 (expt 16 i))) lis_hex)
tương đương với
(nth (vl-position (itoa (fix (/ dec1 (expt 16 i)))) lis_dec) lis_hex)

Trong hàm 16t10 nên cho j=1 ngoài vòng lặp,
sau đó (setq j (* j 16)) bên trong
Trong hàm 10t16 nên thêm 1 biến i16 = (expt 16 i)ngoài vòng lặp,
sau đó (setq i16 (/ i16 16)) bên trong
Có thể dùng (setq j (lsh j 4)) và (setq i16 (lsh i16 -4)) để tăng tốc độ

Trong hàm entbef phải dùng vòng while vì nếu đối tượng có handent bị xóa
thì ena2 = nil, ngoài ra còn phải xét trường hợp ena là đối tượng đầu tiên

Trong hàm C:test ena_bef chưa chắc là 1 entity thì làm sao dùng (command "erase" ena_bef "")
  • 2

#506 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 06 October 2010 - 12:45 PM

Em xin hỏi về đối tượng viewport.
1. Em có đọc trên diễn đàn biết lệnh "mspace" và "pspace" giúp chuyển model vport và thoát ra môi trường layout.
Nhưng lệnh "mspace" chỉ chuyển vào model vport đang active, Vậy nếu như layout1 có 5 viewport1 (có viewportID khác nhau theo mã dxf 69).
Em làm thế nào để kích hoạt vport bất kỳ trong số các vport đang có?
Làm thể nào để chuyển vào vport bất kỳ?
2. Trước khi hỏi vấn đề này có vào help để tìm hiểu thì có đọc đến biến hệ thống "cvport". Không biết biển này có giúp được vấn đề 1 em nếu không nhưng mà em đọc trong help không hiểu đc. Nếu các anh có thể, giải thích luôn dùm em về biến hệ thống này với.
3. Cảm ơn diễn đàn.
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#507 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 07 October 2010 - 03:57 PM

Em xin hỏi về đối tượng viewport.
1. Em có đọc trên diễn đàn biết lệnh "mspace" và "pspace" giúp chuyển model vport và thoát ra môi trường layout.
Nhưng lệnh "mspace" chỉ chuyển vào model vport đang active, Vậy nếu như layout1 có 5 viewport1 (có viewportID khác nhau theo mã dxf 69).
Em làm thế nào để kích hoạt vport bất kỳ trong số các vport đang có?
Làm thể nào để chuyển vào vport bất kỳ?
2. Trước khi hỏi vấn đề này có vào help để tìm hiểu thì có đọc đến biến hệ thống "cvport". Không biết biển này có giúp được vấn đề 1 em nếu không nhưng mà em đọc trong help không hiểu đc. Nếu các anh có thể, giải thích luôn dùm em về biến hệ thống này với.
3. Cảm ơn diễn đàn.

Hề hề hề,
Dốt mà như bạn thì còn khối anh muốn dốt đó....
Hỏi chi mà hóc rứa.
1/- Cái vụ này mình vẫn điếc nên đành dựa cột để nghe vậy.
2/- Về thằng CVport thì:
CVPORT System Variable
Concepts Procedures Reference
Type: Integer
Saved in: Drawing
Initial value: 2

Sets the identification number of the current viewport. You can change this value, which changes the current viewport, if the following conditions are met:

The identification number you specify is that of an active viewport.
A command in progress has not locked cursor movement to that viewport.
Tablet mode is off.
Cứ theo như cái mà mình hiểu thì nó bảo rằng có thể dùng thằng này để thay đổi viewport hiện hành với 3 điều kiện là:
- Cái số CMND mà bạn nhập vô đó phải là của một thằng viewport đang hoạt động (không bị cảnh sát CAD giam giữ hay cấm di chuyển khỏi nơi cu trú)
- Cái lệnh cần thực thi sẽ không khóa chết con trỏ trên viewport này. (nghĩa là túm nó nhưng không được túm thằng cusor con nó)
- Mode tablet phải là off.

Cách mình hiểu đúng hay sai thì nhờ bạn kiểm tra lại nha. Mình điếc về View port nên chả thể kiểm chứng cái hiểu của mình

Hề hề hề,...
3/- Lại làm một việc dư
Hề hề hề....
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#508 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 07 October 2010 - 09:23 PM

Em xin hỏi về đối tượng viewport.
1. Em có đọc trên diễn đàn biết lệnh "mspace" và "pspace" giúp chuyển model vport và thoát ra môi trường layout.
Nhưng lệnh "mspace" chỉ chuyển vào model vport đang active, Vậy nếu như layout1 có 5 viewport1 (có viewportID khác nhau theo mã dxf 69).
Em làm thế nào để kích hoạt vport bất kỳ trong số các vport đang có?
Làm thể nào để chuyển vào vport bất kỳ?

Gọi v là viewport bạn muốn kích hoạt (v à entity type). Bạn thử kiểu này xem:

(command "mspace")
(command "vports" "ON" v "")
  • 2

#509 quangtvxd

quangtvxd

    biết zoom

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

Đã gửi 08 October 2010 - 01:13 PM

Xin hỏi, mình đang dùng lisp để tự động Insert file bằng cách sử dụng Menu hình ảnh, nhưng khi Insert một file cad nào đó ra các block thì điểm "insertion point" của block đó mặc định là điểm nào ?, nó có quy tắc nào không ? (không phải là điểm 0,0 đâu nhé, mình có thử rồi). Cám ơn nha.
  • 0

#510 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 08 October 2010 - 03:43 PM

Xin hỏi, mình đang dùng lisp để tự động Insert file bằng cách sử dụng Menu hình ảnh, nhưng khi Insert một file cad nào đó ra các block thì điểm "insertion point" của block đó mặc định là điểm nào ?, nó có quy tắc nào không ? (không phải là điểm 0,0 đâu nhé, mình có thử rồi). Cám ơn nha.

Mở file cad lên, gõ lệnh base bạn sẽ thấy điểm "insertion point" của file.
-> Enter base point <1681.975,6768.404,0.000>:

Help :
Command entry: base (or 'base for transparent use)
Summary

The base point is expressed as coordinates in the current UCS. When you insert or externally reference the current drawing into other drawings, this base point is used as the insertion base point.

  • 0

#511 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 08 October 2010 - 10:28 PM

Cho e hỏi cách vào 1 block lấy dữ liệu các thành phần của nó như khi dùng ssget để lấy thông tin các đối tượng ko trong block. VD như: Chọn tất cả các đối tượng TEXT trong block có tên là Vidu. và thay đổi chiều cao của nó. THank
  • 0

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


#512 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 October 2010 - 11:02 PM

Cho e hỏi cách vào 1 block lấy dữ liệu các thành phần của nó như khi dùng ssget để lấy thông tin các đối tượng ko trong block. VD như: Chọn tất cả các đối tượng TEXT trong block có tên là Vidu. và thay đổi chiều cao của nó. THank

Bạn tham khảo ở đây : http://www.cadviet.c...mp;#entry111166
  • 1

#513 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 09 October 2010 - 11:46 PM

Em xin hỏi làm thế nào để tạo ra 1 loại đối tượng (Entity type).
Ta vẫn hay vẽ CAD với các Entity type có sẵn của CAD như LINE, POLYLINE, ARC,CIRCLE ... Vậy nếu ta muốn tạo ra 1 Entity type chưa có sẵn thì làm thế nào ạ?
Sở dĩ em hỏi như vậy vì em tìm thấy 1 đối tượng Cad như sau :
Hình đã gửi
Mã DXF của nó là : ((-1 . ) (0 . "TDTDBPOLYLINE") (330 . ) (5 . "852") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "plinetdtn"))
Đối tượng này tạo ra từ 1 chương trình chạy trên Cad là VnRoad (tương tự như chương trình Nova vậy). Khi ta mở file bằng chương trình VnRoad thì ta nhìn thấy đối tượng này. Nhưng khi mở bằng Cad bình thường thì đối tượng này không nhìn thấy được.
Hình đã gửi
Em gởi file cho các anh xem http://www.cadviet.c...pfiles/3/56.dwg

Rõ ràng Entity type "TDTDBPOLYLINE" không có sẵn trong Cad. Vậy chương trình VnRoad đã tạo ra Entity type này như thế nào các anh nhỉ.
  • 0

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#514 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 11 October 2010 - 11:28 PM

E viết cái lisp như này mà ko hiểu sao lại tắc tịt không chạy đc .hjx .Bác nào giúp e với...Thank!!!

(defun BatDau() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))

(defun KetThuc() (setvar "osmode" OldOs)(princ))

(defun moddxf (dxf chdxf ss) (entmod (subst (cons dxf chdxf) (assoc dxf (entget ss)) (entget ss))))

(defun Aver2 (x y) (/ (+ (float x) (float y)) 2) ) ;;;Average x & y, return Real

(defun Mid2P (p1 p2) ;;Middle point from p1, p2
(list (Aver2 (car p1) (car p2)) (Aver2 (cadr p1) (cadr p2)) (Aver2 (caddr p1) (caddr p2)))
)
;=========== Lap Khung Ten ===========;

;====================================;
(defun c:khung (/ dis121 dis141 rpt11 rpt21 rpt31 rpt41 mid121 mid231 mid341 mid411 off_set bn bp
ssbv kmid12 kmid23 kmid34 kmid41 sel entkt Rec Rec1 pt1 pt2 rpt1 rpt2 rpt3 rpt4 mid12
mid23 mid34 mid41 dis12 dis14 dis toadodinh khoangcach i el1 el2 el3 el4 ssd
en OldOs OldEcho )
(vl-load-com)
(setq OldEcho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "undo" "be")
(princ "\n © nguyentuyen6 @CadViet ")
(princ "\n Cai Express-Tools truoc khi su dung!!!")
;====================;
;;;XU LY KHUNG TEN;;;;
;====================;
(setq sel (entsel "\nChon block khung ten:"))
(setq entkt (car sel))
(setq Rec (acet-ent-geomextents entkt)
pt1 (nth 0 Rec);lay dinh
pt2 (nth 1 Rec))
; i 0);setq
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt1 pt2)
(KetThuc)
(setq el1 (entlast));el1

;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh (acet-geom-vertex-list el1);
rpt1 (nth 0 toadodinh);lay dinh
rpt2 (nth 1 toadodinh)
rpt3 (nth 2 toadodinh)
rpt4 (nth 3 toadodinh)
;--
mid12 (Mid2P rpt1 rpt2);lay trung diem
mid23 (Mid2P rpt2 rpt3)
mid34 (Mid2P rpt3 rpt4)
mid41 (Mid2P rpt4 rpt1)
;--
dis12 (distance rpt1 rpt2)
dis14 (distance rpt1 rpt4));setq
;--
(setq kmid12 (polar mid12 (/ pi 2) (/ (* dis14 4) 100))
kmid34 (polar mid34 (/ (* pi 3) 2) (/ (* dis14 4) 100))
kmid23 (polar mid23 pi (/ (*dis12 20) 140))
kmid41 (polar mid41 0.0 (/ (* dis12 6) 140))
)
(command "ERASE" el1 "");xoa hcn

;====================;
;;;XU LY BAN VE;;;;
;====================;

(setq bn (rtos (fix (* (getvar "CDATE") 100000)) 2 0)
; (setq bp (getpoint "\nBase Point <0,0,0>: "))
bp (setq bp '(0 0 0)))
(while (not ssbv)
(setq ssbv (ssget "\nChon ban ve: ")))
(command "_.BLOCK" bn bp ssbv ""
"_.INSERT" bn bp 1 1 0)
(setq el4 (entlast));el4
(princ)
(setq Rec1 (acet-ent-geomextents el4)
pt11 (nth 0 Rec1);lay dinh
pt21 (nth 1 Rec1))
; ii 0);setq
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt11 pt21)
(KetThuc)
(setq el2 (entlast));el2

;-----khoang cach mac dinh
(setq khoangcach (getreal "\nKhoang cach khung ten va ban ve:"))
(if (= khoangcach nil) (setq khoangcach (/ (* dis12 5) 140)))
;---
(setq off_set (polar pt21 (/ pi 2) khoangcach))
(command "OFFSET" el2 off_set);offset
(setq el3 (entlast));el3
;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh1 (acet-geom-vertex-list el3)
rpt11 (nth 0 toadodinh1);lay dinh
rpt21 (nth 1 toadodinh1)
rpt31 (nth 2 toadodinh1)
rpt41 (nth 3 toadodinh1)
;--
mid121 (Mid2P rpt11 rpt21);lay trung diem
mid231 (Mid2P rpt21 rpt31)
mid341 (Mid2P rpt31 rpt41)
mid411 (Mid2P rpt41 rpt11)
;--
dis121 (distance rpt11 rpt21)
dis141 (distance rpt11 rpt41));setq
;----- Chia truong hop cao va dai
(if (> dis121 dis141)
(command "ALIGN" khungten "" kmid41 mid141 kmid23 mid231 "" "Y" "");T
(command "ALIGN" khungten "" kmid34 mid341 kmid12 mid121 "" "Y" "");F
) ;if
;-----
(command "ERASE" el2 "");xoa hcn
(command "ERASE" el3 "");xoa hcn offset
(command "EXPLODE" el4 "")
;---------------
(command "undo" "e")
(KetThuc)
(setvar "cmdecho" OldEcho)
(princ "\n...Done...")
(princ)
);defun

  • 0

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


#515 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 October 2010 - 05:37 AM

E viết cái lisp như này mà ko hiểu sao lại tắc tịt không chạy đc .hjx .Bác nào giúp e với...Thank!!!

(defun BatDau() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))

(defun KetThuc() (setvar "osmode" OldOs)(princ))

(defun moddxf (dxf chdxf ss) (entmod (subst (cons dxf chdxf) (assoc dxf (entget ss)) (entget ss))))

(defun Aver2 (x y) (/ (+ (float x) (float y)) 2) ) ;;;Average x & y, return Real

(defun Mid2P (p1 p2) ;;Middle point from p1, p2
(list (Aver2 (car p1) (car p2)) (Aver2 (cadr p1) (cadr p2)) (Aver2 (caddr p1) (caddr p2)))
)
;=========== Lap Khung Ten ===========;

;====================================;
(defun c:khung (/ dis121 dis141 rpt11 rpt21 rpt31 rpt41 mid121 mid231 mid341 mid411 off_set bn bp ssbv
kmid12 kmid23 kmid34 kmid41 sel entkt Rec Rec1 pt1 pt2 rpt1 rpt2 rpt3 rpt4 mid12 mid23
mid34 mid41 dis12 dis14 dis toadodinh khoangcach i el1 el2 el3 el4 ssd en OldOs OldEcho )
(vl-load-com)
(setq OldEcho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "undo" "be")
(princ "\n © nguyentuyen6 @CadViet ")
(princ "\n Cai Express-Tools truoc khi su dung!!!")
;====================;
;;;XU LY KHUNG TEN;;;;
;====================;
(setq sel (entsel "\nChon block khung ten:"))
(setq entkt (car sel))
(setq Rec (acet-ent-geomextents entkt)
pt1 (nth 0 Rec);lay dinh
pt2 (nth 1 Rec))
; i 0);setq
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt1 pt2)
(KetThuc)
(setq el1 (entlast));el1

;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh (acet-geom-vertex-list el1);
rpt1 (nth 0 toadodinh);lay dinh
rpt2 (nth 1 toadodinh)
rpt3 (nth 2 toadodinh)
rpt4 (nth 3 toadodinh)
;--
mid12 (Mid2P rpt1 rpt2);lay trung diem
mid23 (Mid2P rpt2 rpt3)
mid34 (Mid2P rpt3 rpt4)
mid41 (Mid2P rpt4 rpt1)
;--
dis12 (distance rpt1 rpt2)
dis14 (distance rpt1 rpt4));setq
;--
(setq kmid12 (polar mid12 (/ pi 2) (/ (*dis14 4) 100))
kmid34 (polar mid34 ((* pi 3) 4) (/ (*dis14 4) 100))
kmid23 (polar mid23 (* pi -1) (/ (*dis12 20) 140))
kmid41 (polar mid41 pi (/ (* dis12 6) 140))
)
(command "ERASE" el1 "");xoa hcn

;====================;
;;;XU LY BAN VE;;;;
;====================;

(setq bn (rtos (fix (* (getvar "CDATE") 100000)) 2 0)
; (setq bp (getpoint "\nBase Point <0,0,0>: "))
bp (setq bp '(0 0 0)))
(while (not ssbv)
(setq ssbv (ssget "\nChon ban ve: ")))
(command "_.BLOCK" bn bp ssbv ""
"_.INSERT" bn bp 1 1 0)
(setq el4 (entlast));el4
(princ)
(setq Rec1 (acet-ent-geomextents el4)
pt11 (nth 0 Rec1);lay dinh
pt21 (nth 1 Rec1))
; ii 0);setq
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt11 pt21)
(KetThuc)
(setq el2 (entlast));el2

;-----khoang cach mac dinh
(setq khoangcach (getreal "\nKhoang cach khung ten va ban ve:"))
(if (= khoangcach nil) (setq khoangcach (/ (* dis12 5) 140)))
;---
(setq off_set (polar pt21 (/ pi 2) khoangcach))
(command "OFFSET" el2 off_set);offset
(setq el3 (entlast));el3
;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh1 (acet-geom-vertex-list el3)
rpt11 (nth 0 toadodinh1);lay dinh
rpt21 (nth 1 toadodinh1)
rpt31 (nth 2 toadodinh1)
rpt41 (nth 3 toadodinh1)
;--
mid121 (Mid2P rpt11 rpt21);lay trung diem
mid231 (Mid2P rpt21 rpt31)
mid341 (Mid2P rpt31 rpt41)
mid411 (Mid2P rpt41 rpt11)
;--
dis121 (distance rpt11 rpt21)
dis141 (distance rpt11 rpt41));setq
;----- Chia truong hop cao va dai
(if (> dis121 dis141)
(command "ALIGN" khungten "" kmid41 mid141 kmid23 mid231 "" "Y" "");T
(command "ALIGN" khungten "" kmid34 mid341 kmid12 mid121 "" "Y" "");F
) ;if
;-----
(command "ERASE" el2 "");xoa hcn
(command "ERASE" el3 "");xoa hcn offset
(command "EXPLODE" el4 "")
;---------------
(command "undo" "e")
(KetThuc)
(setvar "cmdecho" OldEcho)
(princ "\n...Done...")
(princ)
);defun

Khi đọc vào -> trước mắt, Tue_NV thấy mấy lỗi cơ bản sau :
(setq kmid12 (polar mid12 (/ pi 2) (/ (*dis14 4) 100))
kmid34 (polar mid34 ((* pi 3) 4) (/ (*dis14 4) 100))
kmid23 (polar mid23 (* pi -1) (/ (*dis12 20) 140))
kmid41 (polar mid41 pi (/ (* dis12 6) 140))
)
Bạn tự tìm lỗi tiếp nhé. Bạn đã viết được như vầy rồi. Hy vọng bạn tìm ra lỗi.
Chúc thành công
  • 1

#516 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 12 October 2010 - 11:00 AM

Em xin hỏi làm thế nào để tạo ra 1 loại đối tượng (Entity type).
Ta vẫn hay vẽ CAD với các Entity type có sẵn của CAD như LINE, POLYLINE, ARC,CIRCLE ... Vậy nếu ta muốn tạo ra 1 Entity type chưa có sẵn thì làm thế nào ạ?
Sở dĩ em hỏi như vậy vì em tìm thấy 1 đối tượng Cad như sau :
Hình đã gửi
Mã DXF của nó là : ((-1 . ) (0 . "TDTDBPOLYLINE") (330 . ) (5 . "852") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "plinetdtn"))
Đối tượng này tạo ra từ 1 chương trình chạy trên Cad là VnRoad (tương tự như chương trình Nova vậy). Khi ta mở file bằng chương trình VnRoad thì ta nhìn thấy đối tượng này. Nhưng khi mở bằng Cad bình thường thì đối tượng này không nhìn thấy được.

Em gởi file cho các anh xem http://www.cadviet.c...pfiles/3/56.dwg

Rõ ràng Entity type "TDTDBPOLYLINE" không có sẵn trong Cad. Vậy chương trình VnRoad đã tạo ra Entity type này như thế nào các anh nhỉ.

Đây là đối tuợng ACAD_PROXY_ENTITY
bạn gõ lệnh LISP sẽ đuợc (ví dụ):
ACAD_PROXY_ENTITY Layer: "plinetdtn"
.....
DXF name: TDTDBPOLYLINE
Class name: TdtDbPolyline
Application name: TDTALIGNMENTDBAPP" "
Product Desc: object is used for displayed the natural line" "
Company: TDT" "
WEB Address: www.tdttech.com.vn

đối tuợng ACAD_PROXY_ENTITY là sản phẩm của ARX. tham khảo : http://www.cadviet.c...showtopic=13031
Trong truờng hợp này VnRoad không cho phép hiển thị trong CAD.
còn việc làm thế nào hiển thị trong Cad, bạn liên hệ với cty TDT- www.tdttech.com.vn
  • 1

#517 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 12 October 2010 - 11:03 AM

Em loay hoay buổi sáng mà không ăn thua bác ah. Em định viết cái líp tự đặt khung tên vào bản vẽ ý mà. Chẳng hiểu sai chỗ nào nữa. Hjx
  • 0

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


#518 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 12 October 2010 - 11:39 AM

Em loay hoay buổi sáng mà không ăn thua bác ah. Em định viết cái líp tự đặt khung tên vào bản vẽ ý mà. Chẳng hiểu sai chỗ nào nữa. Hjx

(setq kmid12 (polar mid12 (/ pi 2) (/ (*dis14 4) 100))

sai chỗ (*dis14 4) -> (* dis14 4)

kmid34 (polar mid34 ((* pi 3) 4) (/ (*dis14 4) 100))

sai chỗ (*dis14 4) -> (* dis14 4) và ((* pi 3) 4) - (/ (* pi 3) 4)

kmid23 (polar mid23 (* pi -1) (/ (*dis12 20) 140))

sai chỗ (*dis12 20) -> (* dis12 20)
  • 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!

#519 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 12 October 2010 - 03:45 PM

không phải bác ạ. Cái đó e sửa theo lời bác Tue rồi mà chạy vẫn báo lỗi. Đây là đoạn líp e đã sửa.

(defun BatDau() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))

(defun KetThuc() (setvar "osmode" OldOs)(princ))

;=========== Lap Khung Ten ===========;

;====================================;
(defun c:khung (/ dis121 dis141 rpt11 rpt21 rpt31 rpt41 mid121 mid231
mid341 mid411 off_set bn bp ssbv kmid12 kmid23 kmid34 kmid41 sel
entkt Rec Rec1 pt1 pt2 rpt1 rpt2 rpt3 rpt4 mid12 mid23 mid34 mid41
dis12 dis14 dis toadodinh khoangcach i el1 el2 el3 el4 ssd en OldOs OldEcho )
(vl-load-com)
(setq OldEcho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "undo" "be")
(princ "\n © nguyentuyen6 @CadViet ")
(princ "\n Cai Express-Tools truoc khi su dung!!!")
;====================;
;;;XU LY KHUNG TEN;;;;
;====================;
(setq sel (entsel "\nChon block khung ten: "))
(setq entkt (car sel))
;(setq khungten (ssget "\nChon khung ten: "))
(setq Rec (acet-ent-geomextents entkt)
pt1 (nth 0 Rec) ;lay dinh *-----pt2
pt2 (nth 1 Rec));lay dinh | khung |
; pt1-----*
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt1 pt2)
(KetThuc)
(setq el1 (entlast));el1

;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh (acet-geom-vertex-list el1); rpt4----rpt3
rpt1 (nth 0 toadodinh);lay dinh | el1 |
rpt2 (nth 1 toadodinh);lay dinh rpt1----rpt2
rpt3 (nth 2 toadodinh);lay dinh
rpt4 (nth 3 toadodinh);lay dinh
mid12 (list (/ (+ (car rpt1) (car rpt2)) 2) (/ (+ (cadr rpt1) (cadr rpt2)) 2));trung diem
mid23 (list (/ (+ (car rpt2) (car rpt3)) 2) (/ (+ (cadr rpt2) (cadr rpt3)) 2))
mid34 (list (/ (+ (car rpt3) (car rpt4)) 2) (/ (+ (cadr rpt3) (cadr rpt4)) 2))
mid41 (list (/ (+ (car rpt4) (car rpt1)) 2) (/ (+ (cadr rpt4) (cadr rpt1)) 2))
dis12 (distance rpt1 rpt2); khoang cach
dis14 (distance rpt1 rpt4)
);setq
;--
(setq kmid12 (polar mid12 (/ pi 2) (/ (* dis14 4) 100))
kmid34 (polar mid34 (/ (* pi 3) 2) (/ (* dis14 4) 100))
kmid23 (polar mid23 pi (/ (* dis12 20) 140))
kmid41 (polar mid41 0.0 (/ (* dis12 6) 140))
)
(command "ERASE" el1 "");xoa hcn

;====================;
;;;XU LY BAN VE;;;;
;====================;

(setq bn (rtos (fix (* (getvar "CDATE") 100000)) 2 0)); block ban ve
; (setq bp (getpoint "\nBase Point <0,0,0>: "))
; bp (setq bp '(0 0 0)))
(while (not ssbv)
(setq ssbv (ssget "\nChon ban ve: ")))
(command "_.BLOCK" bn kmid41 ssbv ""
"_.INSERT" bn kmid41 1 1 0)
(setq el4 (entlast));el4
;----
(setq Rec1 (acet-ent-geomextents el4)
pt11 (nth 0 Rec1);lay dinh *-----pt2
pt21 (nth 1 Rec1));lay dinh | bve |
; ii 0);setq pt1-----*
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt11 pt21)
(KetThuc)
(setq el2 (entlast));el2

;-----khoang cach mac dinh
(setq khoangcach (getreal "\nKhoang cach khung ten va ban ve:"))
(if (= khoangcach nil) (setq khoangcach (/ (* dis12 5) 140)))
;---
(setq off_set (polar pt21 (/ pi 2) khoangcach))
(command "OFFSET" el2 off_set);offset
(setq el3 (entlast));el3
;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh1 (acet-geom-vertex-list el3); rpt4----rpt3
rpt11 (nth 0 toadodinh1);lay dinh | bve |
rpt21 (nth 1 toadodinh1);lay dinh rpt1----rpt2
rpt31 (nth 2 toadodinh1);lay dinh
rpt41 (nth 3 toadodinh1);lay dinh
;--
;lay trung diem
mid121 (list (/ (+ (car rpt11) (car rpt21)) 2) (/ (+ (cadr rpt11) (cadr rpt21)) 2))
mid231 (list (/ (+ (car rpt2) (car rpt31)) 2) (/ (+ (cadr rpt21) (cadr rpt31)) 2))
mid341 (list (/ (+ (car rpt3) (car rpt41)) 2) (/ (+ (cadr rpt31) (cadr rpt41)) 2))
mid411 (list (/ (+ (car rpt4) (car rpt11)) 2) (/ (+ (cadr rpt41) (cadr rpt11)) 2))

;--
dis121 (distance rpt11 rpt21)
dis141 (distance rpt11 rpt41));setq
;----- Chia truong hop cao va dai
(if (> dis121 dis141)
(command "ALIGN" khungten "" kmid41 mid141 kmid23 mid231 "" "Y" "");T
(command "ALIGN" khungten "" kmid34 mid341 kmid12 mid121 "" "Y" "");F
) ;if
;-----
(command "ERASE" el2 "");xoa hcn
(command "ERASE" el3 "");xoa hcn offset
(command "EXPLODE" el4 "")
;---------------
(command "undo" "e")
(KetThuc)
(setvar "cmdecho" OldEcho)
(princ "\n...Done...")
(princ)
);defun

  • 0

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


#520 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 12 October 2010 - 03:55 PM

không phải bác ạ. Cái đó e sửa theo lời bác Tue rồi mà chạy vẫn báo lỗi. Đây là đoạn líp e đã sửa.

(defun BatDau() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))

(defun KetThuc() (setvar "osmode" OldOs)(princ))

;=========== Lap Khung Ten ===========;

;====================================;
(defun c:khung (/ dis121 dis141 rpt11 rpt21 rpt31 rpt41 mid121 mid231 mid341 mid411 off_set bn bp
ssbv kmid12 kmid23 kmid34 kmid41 sel entkt Rec Rec1 pt1 pt2 rpt1 rpt2 rpt3 rpt4 mid12 mid23
mid34 mid41 dis12 dis14 dis toadodinh khoangcach i el1 el2 el3 el4 ssd en OldOs OldEcho )
(vl-load-com)
(setq OldEcho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "undo" "be")
(princ "\n © nguyentuyen6 @CadViet ")
(princ "\n Cai Express-Tools truoc khi su dung!!!")
;====================;
;;;XU LY KHUNG TEN;;;;
;====================;
(setq sel (entsel "\nChon block khung ten: "))
(setq entkt (car sel))
;(setq khungten (ssget "\nChon khung ten: "))
(setq Rec (acet-ent-geomextents entkt)
pt1 (nth 0 Rec) ;lay dinh *-----pt2
pt2 (nth 1 Rec));lay dinh | khung |
; pt1-----*
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt1 pt2)
(KetThuc)
(setq el1 (entlast));el1

;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh (acet-geom-vertex-list el1); rpt4----rpt3
rpt1 (nth 0 toadodinh);lay dinh | el1 |
rpt2 (nth 1 toadodinh);lay dinh rpt1----rpt2
rpt3 (nth 2 toadodinh);lay dinh
rpt4 (nth 3 toadodinh);lay dinh
mid12 (list (/ (+ (car rpt1) (car rpt2)) 2) (/ (+ (cadr rpt1) (cadr rpt2)) 2));trung diem
mid23 (list (/ (+ (car rpt2) (car rpt3)) 2) (/ (+ (cadr rpt2) (cadr rpt3)) 2))
mid34 (list (/ (+ (car rpt3) (car rpt4)) 2) (/ (+ (cadr rpt3) (cadr rpt4)) 2))
mid41 (list (/ (+ (car rpt4) (car rpt1)) 2) (/ (+ (cadr rpt4) (cadr rpt1)) 2))
dis12 (distance rpt1 rpt2); khoang cach
dis14 (distance rpt1 rpt4)
);setq
;--
(setq kmid12 (polar mid12 (/ pi 2) (/ (* dis14 4) 100))
kmid34 (polar mid34 (/ (* pi 3) 2) (/ (* dis14 4) 100))
kmid23 (polar mid23 pi (/ (* dis12 20) 140))
kmid41 (polar mid41 0.0 (/ (* dis12 6) 140))
)
(command "ERASE" el1 "");xoa hcn

;====================;
;;;XU LY BAN VE;;;;
;====================;

(setq bn (rtos (fix (* (getvar "CDATE") 100000)) 2 0)); block ban ve
; (setq bp (getpoint "\nBase Point <0,0,0>: "))
; bp (setq bp '(0 0 0)))
(while (not ssbv)
(setq ssbv (ssget "\nChon ban ve: ")))
(command "_.BLOCK" bn kmid41 ssbv ""
"_.INSERT" bn kmid41 1 1 0)
(setq el4 (entlast));el4
;----
(setq Rec1 (acet-ent-geomextents el4)
pt11 (nth 0 Rec1);lay dinh *-----pt2
pt21 (nth 1 Rec1));lay dinh | bve |
; ii 0);setq pt1-----*
;-----acet-ent-geomextents:diem thap nhat trai va cao nhat phai
(BatDau)
(command "RECTANG" pt11 pt21)
(KetThuc)
(setq el2 (entlast));el2

;-----khoang cach mac dinh
(setq khoangcach (getreal "\nKhoang cach khung ten va ban ve:"))
(if (= khoangcach nil) (setq khoangcach (/ (* dis12 5) 140)))
;---
(setq off_set (polar pt21 (/ pi 2) khoangcach))
(command "OFFSET" el2 off_set);offset
(setq el3 (entlast));el3
;-----lay dinh HCN = acet-geom-vertex-list
(setq toadodinh1 (acet-geom-vertex-list el3); rpt4----rpt3
rpt11 (nth 0 toadodinh1);lay dinh | bve |
rpt21 (nth 1 toadodinh1);lay dinh rpt1----rpt2
rpt31 (nth 2 toadodinh1);lay dinh
rpt41 (nth 3 toadodinh1);lay dinh
;--
;lay trung diem
mid121 (list (/ (+ (car rpt11) (car rpt21)) 2) (/ (+ (cadr rpt11) (cadr rpt21)) 2))
mid231 (list (/ (+ (car rpt2) (car rpt31)) 2) (/ (+ (cadr rpt21) (cadr rpt31)) 2))
mid341 (list (/ (+ (car rpt3) (car rpt41)) 2) (/ (+ (cadr rpt31) (cadr rpt41)) 2))
mid411 (list (/ (+ (car rpt4) (car rpt11)) 2) (/ (+ (cadr rpt41) (cadr rpt11)) 2))

;--
dis121 (distance rpt11 rpt21)
dis141 (distance rpt11 rpt41));setq
;----- Chia truong hop cao va dai
(if (> dis121 dis141)
(command "ALIGN" khungten "" kmid41 mid141 kmid23 mid231 "" "Y" "");T
(command "ALIGN" khungten "" kmid34 mid341 kmid12 mid121 "" "Y" "");F
) ;if
;-----
(command "ERASE" el2 "");xoa hcn
(command "ERASE" el3 "");xoa hcn offset
(command "EXPLODE" el4 "")
;---------------
(command "undo" "e")
(KetThuc)
(setvar "cmdecho" OldEcho)
(princ "\n...Done...")
(princ)
);defun

Lỗi : ; error: bad point argument
ở đây :
(while (not ssbv)
(setq ssbv (ssget "\nChon ban ve: ")))
Dò tiếp nhé bạn :cheers:
  • 1