Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Song Nhi    52

Cám ơn anh, em vướng chỗ không biết những đặc trưng của HCN (chiều dài cạnh) quy định bằng mã DXF nào thô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
phamthanhbinh    3.123

Cám ơn anh, em vướng chỗ không biết những đặc trưng của HCN (chiều dài cạnh) quy định bằng DXF nào thôi ạ!

Hề hề hề,

Vấn đề ở chỗ bạn vẽ HCN bằng lệnh gì???

Nếu là dùng lwpolyline thì bạn có thể dùng hàm (acet-geom-verrtex-list ename) để d8u7o75c một danh sách (list) các tọa độ đỉnh của HCN. Sau đó lấy min các tọa độ x và y sẽ được điểm bottom left hoặc lấy max các tọa độ x, y để có điểm Upper right.

Hề hề hề,...

  • 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
duy782006    1.373
(defun taobl ()
(entmake (list (cons 0 "BLOCK")(cons 2 "duy")(cons 70 64)(cons 10 (list 0 0 0))))
(entmake (list (cons 0 "LINE")(cons 8 "0")(cons 10 (list 0.0000000000 0.0000000000 0.0000000000))(cons 11 (list 600.0249719002 -898.9353839716 0.0000000000))))
(entmake (list (cons 0 "LINE")(cons 8 "0")(cons 10 (list 0.0000000000 0.0000000000 0.0000000000))(cons 11 (list 582.0242249153 371.5599567631 0.0000000000))))
(entmake (list (cons 0 "ATTRIB")(cons 10 (list 0.0000000000 0.0000000000 0.0000000000))(cons 40 250)(cons 50 90)(cons 72 0)(cons 1 "duythu")(cons 2 "thu"))) 
(entmake (list (cons 0 "ENDBLK")))
)

Đang tập tò tạo block bằng entmake mà cái dòng tạo ATT nó hông đúng bác nào đập cho nó phát giúp 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
Doan Van Ha    2.676

Hàm tạo block att bằng entmake phức tạp lắm mà sao thấy bác Duy chơi gọn gàng vậy?

Bác tham khảo cái này của bạn Thai post đã lâu rồi nè!


;;;=============== Make insert block
(defun MakeInsert (Blkname inspoint scale ang list_att layer color xdata / lst obj i)
(setq lst '() i -1 en (cdr (last (tblsearch "block" Blkname))) obj (entget en))
(if (= (cdr(assoc 0 obj)) "ATTDEF")
(setq lst (list (list
(cdr(assoc 10 obj))(cdr(assoc 11 obj))(cdr(assoc 50 obj))(cdr(assoc 8 obj))(cdr(assoc 70 obj))(cdr(assoc 62 obj))
(cdr(assoc 40 obj))(assoc 7 obj)(assoc 71 obj)(assoc 72 obj)(assoc 2 obj)))))
(while (setq en (entnext en))
(if (= (cdr(assoc 0 (setq obj(entget en)))) "ATTDEF")
(setq lst (cons (list
(cdr(assoc 10 obj))(cdr(assoc 11 obj))(cdr(assoc 50 obj))(cdr(assoc 8 obj))(cdr(assoc 70 obj))(cdr(assoc 62 obj))
(cdr(assoc 40 obj))(assoc 7 obj)(assoc 71 obj)(assoc 72 obj)(assoc 2 obj))lst))))
(entmakex(list
'(0 . "INSERT")'(100 . "AcDbEntity")
(cons 8 (if Layer Layer (getvar "Clayer")))
(cons 62 (if Color Color 256))
'(100 . "AcDbBlockReference")
(if list_att '(66 . 1) '(66 . 0))
(cons 2 Blkname)
(cons 10 (trans inspoint 1 0))
(cons 41 scale)(cons 42 scale)(cons 43 scale)
(cons 50 Ang)
(cons -3 (if xdata (list xdata) nil))))
(if lst
(foreach LL (reverse lst) (entmake(list
'(0 . "ATTRIB")'(100 . "AcDbEntity")(cons 8 (cadddr LL))(cons 60 (nth 4 LL))
    (if (nth 5 LL) (cons 62 (nth 5 LL)) '(62 . 256))'(100 . "AcDbText")
(cons 10(mapcar'+(trans inspoint 1 0)(mapcar'(lambda(x)(* scale x))(polar'(0 0 0)(+(angle'(0 0 0)(car LL))ang)(distance'(0 0 0)(car LL))))))
(cons 40 (* scale (nth 6 LL)))
(cons 1 (nth (setq i (1+ i))list_att))
(cons 50 (+ ang (caddr LL)))
'(41 . 1.0)(nth 7 LL)(nth 8 LL)(nth 9 LL)
(if (= 0(cdr (nth 8 LL))(cdr(nth 9 LL)))(cons 11(list 0 0 0))
(cons 11(mapcar'+(trans inspoint 1 0)(mapcar'(lambda(x)(* scale x))(polar'(0 0 0)(+(angle'(0 0 0)(cadr LL))ang)(distance'(0 0 0)(cadr LL)))))))
'(100 . "AcDbAttribute")'(280 . 0)(last LL)'(70 . 0)'(280 . 1)))))
(cdr (assoc 330 (entget (entmakex (list '(0 . "SEQEND") (cons 8 (if Layer Layer (getvar "Clayer"))))))))) 
 

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

Đọc rồi muốn quay lòng đòng. Cũng dòm ngó trên cadviet 3 ngày nay về vụ này mà thấy khó nhằn quá muốn có dòng tạo att ngắn ngắn giống như tạo text cho nó lành. Xong thì mới nhồi đoạn đọc đối tượng có sẳn viết thành đoạn tạo block.

(defun taobl ()
(entmake (list (cons 0 "BLOCK")(cons 2 "duy")(cons 70 64)(cons 10 (list 0 0 0))))
(entmake (list (cons 0 "TEXT")(cons 50 0.0000000000)(cons 72 0)(cons 1 "MAËT BAÈNG TAÀNG 1")(cons 7 "DIM")(cons 40 500.0000000000)(cons 8 "THAY-130")(cons 10 (list -3509.0529247911 265.5988857939 0.0000000000))(cons 11 (list -3509.0529247911 265.5988857939 0.0000000000))))
(entmake (list (cons 0 "LINE")(cons 8 "CAT-20")(cons 10 (list -3295.9610027856 0.0000000000 0.0000000000))(cons 11 (list 3295.9610027856 0.0000000000 0.0000000000))))
(entmake (list (cons 0 "ENDBLK")))
)

Kiểu vầy 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
Doan Van Ha    2.676

Tôi vẫn chưa hiểu hết ý bác. Có phải bác muốn tạo đối tượng attribute bằng entmake, rồi sau đó mọi việc tính tiếp?

Nếu đúng ý thì bác dùng cái này xem. Còn sai thì mong bác giải thích thêm.


(defun AttDef (tag prmpt def pt hgt flag)
  (entmakex (list (cons 0 "ATTDEF")
                  (cons 10   pt)
                  (cons 40  hgt)
                  (cons 1   def)
                  (cons 3 prmpt)
                  (cons 2   tag)
                  (cons 70 flag))))
 

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

Bác Duy google với từ khóa "make entmake" đi. Đó là "cây đũa thần" của dân lập trình lisp đấy, nó dùng để tạo code lisp entmake cho mọi loại đối tượng từ đối tượng mẫu trên bản vẽ. Bác cũng nên giữ cho mình 1 bản phòng thân bác a.

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

em đang viết 1 đoạn code ngắn , trong đó dùng vòng lặp while nhưng ko hiểu sao vòng lặp lại ko kết thúc dc , nó cứ lặp mãi dẫn đến việc treo máy .em post lên nhờ các bác phân tích lỗi hộ e .

thank các bác .

(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4" "-100")
(initget 1 "1 75")
(while (setq mai (getkword "\n nhap do doc mai <1 hoac 75>: "))
(if (= mai "1")
(command "6" "-100" "2" "10")
(command "8" (-(/ 100 0.75)) "2" "10")
)
(initget 1 "1 75")
)
(command "" a b "")
(setvar "osmode" 33 )
(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
Doan Van Ha    2.676

1). Initget mà có 1 >> không chấp nhận enter >> không thể thoát bằng cách enter >> bỏ số 1 đi.

2). Lệnh TL là lệnh gì vậy?

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
gadibo    2

1). Initget mà có 1 >> không chấp nhận enter >> không thể thoát bằng cách enter >> bỏ số 1 đi.

2). Lệnh TL là lệnh gì vậy?

em đã làm dc ,thay bit bằng 2 thì nó đã kết thúc .

PS : cho em hỏi chút về hàm while :

(while TESTEXPR EXPR ....)

TESTEXPR là điều kiện để lặp còn EXPR biểu thức định giá trị .

em đang mơ hồ ở chỗ

(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4" "-100")
(initget 1 "1 75")
(while (setq mai (getkword "\n nhap do doc mai <1 hoac 75>: ")) ; điều kiện
(if (= mai "1"); biểu thức sau điều kiện
(command "6" "-100" "2" "10")
(command "8" (-(/ 100 0.75)) "2" "10")
)
(initget 1 "1 75") ; tại sao lại phải thêm cái này vào thì vòng lặp mới ổn ( có thể em chưa hiểu lắm )
)
(command "" a b "")
(setvar "osmode" 33 )
(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
phamthanhbinh    3.123

 

em đã làm dc ,thay bit bằng 2 thì nó đã kết thúc .

PS : cho em hỏi chút về hàm while :

(while TESTEXPR EXPR ....)

TESTEXPR là điều kiện để lặp còn EXPR biểu thức định giá trị .

em đang mơ hồ ở chỗ

(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4" "-100")
(initget 1 "1 75")
(while (setq mai (getkword "\n nhap do doc mai <1 hoac 75>: ")) ; điều kiện
(if (= mai "1"); biểu thức sau điều kiện
(command "6" "-100" "2" "10")
(command "8" (-(/ 100 0.75)) "2" "10")
)
(initget 1 "1 75") ; tại sao lại phải thêm cái này vào thì vòng lặp mới ổn ( có thể em chưa hiểu lắm )
)
(command "" a b "")
(setvar "osmode" 33 )
(princ)
)

Hề hề hề,

Bạn ga-ne-po thử đọc cái này xem nó có sáng ra tí ti nào không nhé. Nó nằm trong Help của CAD.

 

Establishes keywords for use by the next user-input function call

(initget [bits] [string])

The functions that honor keywords are getint, getreal, getdist, getangle, getorient, getpoint, getcorner, getkword, entsel, nentsel, and nentselp. The getstring function is the only user-input function that does not honor keywords.

The keywords are checked by the next user-input function call when the user does not enter the expected type of input (for example, a point to getpoint). If the user input matches a keyword from the list, the function returns that keyword as a string result. The application can test for the keywords and perform the action associated with each one. If the user input is not an expected type and does not match a keyword, AutoCAD asks the user to try again. The initget bit values and keywords apply only to the next user-input function call.

If initget sets a control bit and the application calls a user-input function for which the bit has no meaning, the bit is ignored.

If the user input fails one or more of the specified conditions (as in a zero value when zero values are not allowed), AutoCAD displays a message and asks the user to try again.

Arguments

bits

A bit-coded integer that allows or disallows certain types of user input. The bits can be added together in any combination to form a value between 0 and 255. If no bits argument is supplied, zero (no conditions) is assumed. The bit values are as follows:

1 (bit 0)  Prevents the user from responding to the request by entering only ENTER.

2 (bit 1)  Prevents the user from responding to the request by entering zero.

4 (bit 2)  Prevents the user from responding to the request by entering a negative value.

8 (bit 3)  Allows the user to enter a point outside the current drawing limits. This condition applies to the next user-input function even if the AutoCAD system variable LIMCHECK is currently set.

16 (bit 4)  (Not currently used.)

32 (bit 5)  Uses dashed lines when drawing a rubber-band line or box. For those functions with which the user can specify a point by selecting a location in the drawing area, this bit value causes the rubber-band line or box to be dashed instead of solid. (Some display drivers use a distinctive color instead of dashed lines.) If the system variable POPUPS is 0, AutoCAD ignores this bit.

64 (bit 6)  Prohibits input of a Z coordinate to the getdist function; lets an application ensure that this function returns a 2D distance.

128 (bit 7)  Allows arbitrary input as if it is a keyword, first honoring any other control bits and listed keywords. This bit takes precedence over bit 0; if bits 7 and 0 are set and the user presses ENTER, a null string is returned.

Note  Future versions of AutoLISP may use additional initget control bits, so avoid setting bits that are not listed here.

string

A string representing a series of keywords. See Keyword Specifications for information on defining keywords.

Return Values

nil

  • 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
Doan Van Ha    2.676

 

em đã làm dc ,thay bit bằng 2 thì nó đã kết thúc .

PS : cho em hỏi chút về hàm while :

(while TESTEXPR EXPR ....)

TESTEXPR là điều kiện để lặp còn EXPR biểu thức định giá trị .

em đang mơ hồ ở chỗ

(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4" "-100")
(initget 1 "1 75")
(while (setq mai (getkword "\n nhap do doc mai <1 hoac 75>: ")) ; điều kiện
(if (= mai "1"); biểu thức sau điều kiện
(command "6" "-100" "2" "10")
(command "8" (-(/ 100 0.75)) "2" "10")
)
(initget 1 "1 75") ; tại sao lại phải thêm cái này vào thì vòng lặp mới ổn ( có thể em chưa hiểu lắm )
)
(command "" a b "")
(setvar "osmode" 33 )
(princ)
)

1). Thay 1 bởi 2 là thừa.

2). testexpr: đúng.

3). [expr...]: sai. Nó là tất cả biểu thức nằm trong while, đằng sau biểu thức testexpr.

4). Hàm getkword luôn luôn đi với initget. Nếu thiếu tức là code đã lỗi chứ không phải nhờ có nó mà while có thể kết thúc được.

  • 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
gadibo    2
(defun c:TLT ( / a b mai )
(setvar "osmode" 33 )
(setq a (getpoint "\n pick diem dau ranh"))
(setvar "osmode" 0 )
(setq b (polar a 0 1.2))
(command "TL" a "0.4" "100" "0.4" "0" "0.4" "-100")
(initget 1 "1 75"); em ko hiểu tại sao chỗ này đã có hàm initget mà cuối hàm while lại phải thêm nó vào
(while (setq mai (getkword "\n nhap do doc mai <1 hoac 75>: "))
(if (= mai "1")
(command "6" "-100" "2" "10")
(command "8" (-(/ 100 0.75)) "2" "10")
)
(initget 1 "1 75"); tại sao lại phải thêm hàm này vào vị trí này
)
(command "" a b "")
(setvar "osmode" 33 )
(princ)
)

================================

em không hiểu tại sao lại phải thêm (initget 1 "1 75") vào cuối hàm while để nó có thể lặp đú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
Doan Van Ha    2.676

 


em không hiểu tại sao lại phải thêm (initget 1 "1 75") vào cuối hàm while để nó có thể lặp đúng.

Hàm getkword phải đi cặp với initget. Nếu gọi một mình getkword mà không có initget thì không bao giờ nhập số liệu được >> phải có initget vào cuối while để sau mỗi vòng lặp là lại có 1 cặp Ini và Get đi cùng.

Ở vòng 1: Ini nằm trước Get >> đủ cặp.

Ở vòng 2: Ini cuối của vòng 1 trở thành đầu của vòng 2 >> có đủ cặp Ini và Get.

V.v...

Có thể viết như thế này là dễ hiểu hơn cả:

(while (and  (not (initget "1 175"))  (setq mai (getkword...)))

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

Hàm getkword phải đi cặp với initget. Nếu gọi một mình getkword mà không có initget thì không bao giờ nhập số liệu được >> phải có initget vào cuối while để sau mỗi vòng lặp là lại có 1 cặp Ini và Get đi cùng.

Ở vòng 1: Ini nằm trước Get >> đủ cặp.

Ở vòng 2: Ini cuối của vòng 1 trở thành đầu của vòng 2 >> có đủ cặp Ini và Get.

V.v...

Có thể viết như thế này là dễ hiểu hơn cả:

(while (and  (not (initget "1 175"))  (setq mai (getkword...)))

vâng e cảm ơn bác , em đã hình dung ra cách làm việc của vòng while , lý do vòng ko lặp dc là vì ko có hàm ini trong vòng lặp . híc . cảm ơn các anh nhiều .

đang học mót từng hàm 1 , đọc 2 cuốn của nguyễn hữu lộc mà hoa cả mắt  , vận dụng thực tế nhanh hơn 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
TRUNGNGAMY    91

Các bạn thân mến.

Mình thấy trên CV có rất nhiều lisp tạo đường boundary, nếu muốn cad trả về tập hợp các đối tượng "dẫn đường" tạo nên cái đường bao đó thì làm thế nào.

Mong các bạn giúp đỡ. Cám ơn các 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
Doan Van Ha    2.676

Bài toán ngược này có lẽ không có đáp án chăng?

Có các objects dẫn đường thì tạo được 1 boundary. Nhưng có 1 boundary thì có thể có vô số objects dẫn đường cơ mà?

Hay do chưa hiểu ý bạn? Lâu ngày gặp lại: chức sức khỏe!

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
TRUNGNGAMY    91

Bài toán ngược này có lẽ không có đáp án chăng?

Có các objects dẫn đường thì tạo được 1 boundary. Nhưng có 1 boundary thì có thể có vô số objects dẫn đường cơ mà?

Hay do chưa hiểu ý bạn? Lâu ngày gặp lại: chức sức khỏe!

 

Cám ơn bạn. Ý mình muốn nói đến các đối tượng bị đường bao trùng lên (1 hay toàn phần) mà thô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
sontvxd10    2

Mình muốn tìm líp tính khối lượng đào và đắp từ 4 điểm chênh cao. Cái này hinh nhu của bác boxman trên 4r mình. Nhưng link die ca. AE nào có gửi giùm mình với. Thx nhiều

  • Vote giảm 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
hdt4151    1

Nhờ mọi người giúp đỡ, mình cần 1lisp có chức năng như sau:

 

-Chọn đối tượng, nhóm đối tượng bất kì

- Chọn điểm chèn

- Gõ tên block

- Thực hiện copy nhóm đối tượng đã chọn lên tất cả block có trên bản vẽ tại điểm chèn của block

  • Vote giảm 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    3.123

Nhờ mọi người giúp đỡ, mình cần 1lisp có chức năng như sau:

 

-Chọn đối tượng, nhóm đối tượng bất kì

- Chọn điểm chèn

- Gõ tên block

- Thực hiện copy nhóm đối tượng đã chọn lên tất cả block có trên bản vẽ tại điểm chèn của block

Hề hề hề,

Đây là topic về thuật toán. Chả hiểu ông bác này muốn cái chi nữa????

Nếu muốn viết lisp thì xin chuyển sang topic khác.

Còn nếu muốn hỏi về thuật toán thì quá đơn giản:

1/- Chọn nhóm đối tượng nguồn bằng hàm ssget sẽ được tập nguồn

2/- chọn điểm chuẩn cho tập nguồn này để làm gốc copy.

3/- Chọn tập đối tượng đích bằng hàm ssget với bộ lọc tên block.

4/- tạo vòng lặp qua tập đích lầy điểm chèn của mỗi đối tượng và copy tập nguồn về đó.

5/- xong cái ột.....

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
Doan Van Ha    2.676

Chuyển mã từ TCVN3 sang Unicode cho file Excel bằng Lisp:

Bằng Lisp: có cách nào để chuyển 1 file excel viết bằng tiếng Việt có dấu, bởi TCVN3, sang Unicode không các bác ơ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

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


×