ngokiet
-
Số lượng nội dung
404 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
43
Bài đăng được đăng bởi ngokiet
-
-
58 phút trước, loststars đã nói:em gửi bác ạ.
bác dùng cái lệnh txt2lsp trên đó.
chọn lần lượt 3 cái text trong cad
Rồi đưa lên dạng
text 1 (183 32 208 32 204 32 ....)
text 2(183 32 208 32 204 32 ....)
text 3 (183 32 208 32 204 32 ....)
- chứ mình thấy do font bạn là shx nên ko chăc. chứ font .vnarial nó có hiện đúng ko vậy
-
Bác dùng lệnh TXT2LSP của bác trên cho 3 text
1. text gốc
2. text sau khi dùng lệnh
3. Text bác mong muốn
-
-
2 phút trước, loststars đã nói:Tức là chương trình nhận định đây là unicode sẵn r nên sẽ k chuyển sang tcvn3 nữa đúng k ạ.
Mình chưa xem kỹ phần code hàm convert nên không rõ. Nhưng ngay cả ấn định Tcvn3- Unicode nó vẫn khong chuyển.
Chắc là do nó hiểu /U+00D0 là chữ bình thương ko phải tiếng việt
-
52 phút trước, loststars đã nói:cái vấn đề này đau đầu quá nhỉ. nhưng k biết cái này là lỗi ở đâu mà có sự khác biệt giữa những máy ạ? e tưởng bảng mã chữ này phải chung một bảng hết chứ ạ
Lỗi là ở chỗ thay vì "Đ" nó thành "/U+00D0" nên nó không chuyển. Chỉ có mã đầu 183 nó chuyển thành chừ "Ó" thôi
Cái này chắc do setcode của HDH nên Cad mới chuyển qua thể hiễn kiểu /U+ nên chương trình bị lỗi.
Muốn xử lý lỗi này thì khi code lisp convert xét thêm các ký tự kiểu này.
-
47 phút trước, huunhantvxdts đã nói:Lisp ở trên nó cho phép đo đường cong rồi nên không cần kiểm tra chỉ cần bắt được đối tượng polyline đưa vào thôi.
đây là lisp mình viết có thêm 1 bước là chọn đối tượng sau khi filett
(defun C:VBK(/ ) (command "undo" "be") (setq cur_lay (getvar "clayer" )) (setq oldos (getvar "OSMODE")) (setvar "osmode" 0) (setvar "cmdecho" 0) (while ;(setq dtuong1 (car (entsel "\nChon doi tuong 1"))) (or (and bkinh (or (= (type bkinh) 'int) (= (type bkinh) 'real))) (setq bkinh 5.00)) (setq bkinh (cond ((getreal (strcat "\nNhap ban kinh cong (m) <" (rtos bkinh 2 2) ">: "))) (bkinh))) (command "FILLET" "R" bkinh) (command "FILLET" pause pause) (dobk) ) (setvar "clayer" cur_lay) (setvar "osmode" oldos) (setvar "CMDECHO" 1) (command "undo" "end") (princ) ) ;;;;;;;;;;;;;;;;;;;;;;; (defun dobk (/ acadobj doc i modelspace obj LM:BulgeCenter) (defun LM:BulgeCenter (p1 p2 B) (polar p1 (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan B)))) (/ (* (distance p1 p2) (1+ (* b B))) 4 B))) (setq acadObj (vlax-get-acad-object)) (setq doc (vla-get-activedocument acadObj)) (setq modelSpace (vla-get-modelspace doc)) (setq i 0) (setq e (car (entsel "\nChon cung dien ban kinh"))) (setq obj (vlax-ename->vla-object e)) (repeat (fix (vlax-curve-getendparam e)) (if (/= 0 (vla-getbulge obj i)) (vla-adddimradial modelSpace (vlax-3d-point (LM:BulgeCenter (vlax-curve-getpointatparam e i) (vlax-curve-getpointatparam e (1+ i)) (vla-getbulge obj i))) (vlax-3d-point (vlax-curve-getpointatparam e (+ i 0.5))) -0.5) ) (setq i (1+ i)) ) (princ) )
Sao bạn làm rắc rối vậy.
Bác chỉ cần thêm dòng này thay cho gọi hàm dobk là được rồi.
(command "dimradius" "mid" pause "")
Với lại vòng lặp while của bạn không có kết thúc trừ nhấn Esc nên các biến bạn lưu lại nó không trả về.
Còn mình chỉ cần viết vậy là đủ
(defun c:vbk(/ bkinh) (If (setq bkinh (getreal (strcat "\nNhap ban kinh cong (m) <" (rtos (getvar 'filletrad) 2 2) ">: ")) (setvar 'filletrad bkinh)) (command "fillet" pause pause) (command "dimradius" pause ""))
Còn hàm dobk của bạn hình như là ghi kích thước tất cả các arc có trong polyline nên dễ bị trùng dim nếu polyline có arc trước khi fillet.
Còn nếu bạn muốn bỏ chọn như bạn nói thì có mấy trường hợp
- 2 line or 2 arc thì nó là (entlast)
- nếu đối tượng 1 là polyline thì nó là đối tượng 1 còn ko thì đối tượng 2.
Vì vậy nếu bạn chắc chắn dt1 là polyline thì bạn muốn lấy đối tượng đó thì bạn đổi dòng
(command "FILLET" pause pause)
Thành
(if (setq dt1 (entsel "Nhap doi tuong 1")) (command "fillet" dt1 pause))
- 1
-
Fillet và Chamfer của autocad hơi khó chịu. Fillet đôi khi xảy ra lỗi khi fillet các cung tròn. Chamfer thì Arc không hỗ trợ. Chamfer polyline có Arc là sai vì nó tính arc như đường thẳng. Mình cũng tính viết lại 2 lệnh này nhưng chắc cũng không free được đâu.
-
16 phút trước, Danh Cong đã nói:+ Bạn có thể tham khảo code của nợ này : ))))
https://www.cadtutor.net/forum/topic/30482-dim-radius/
Riêng code tự động đo góc thì không được hoàn thiện ( do chưa hiểu thông số tọa độ của nó ).
+ Code sai vòng lặp while.
(defun C:VBK( / DTUONG1 DTUONG2 ) (command "undo" "be") (or (and bkinh (or (= (type bkinh) 'int) (= (type bkinh) 'real))) (setq bkinh 5.00)) (setq bkinh (cond ((getreal (strcat "\nNhap ban kinh cong (m) <" (rtos bkinh 2 2) ">: "))) (bkinh))) (while (and (setq dtuong1 (car (entsel "\nChon doi tuong 1"))) (setq dtuong2 (car (entsel "\nChon doi tuong 2"))) ); end and (command "FILLET" dtuong1 dtuong2) (command "DIMRADIUS" (list (entlast) (cdr (assoc 10 (entget (entlast)))) ) "_non" "") ) (command "undo" "end") (princ) )
Hình như bác không xem kỹ. nếu 2 line hay 2 arc thì mới có entlast đễ ghi kích thước thì dễ rồi. 2 polyline thì khó.
-
8 phút trước, Black_Cat_ đã nói:tại vì lệnh cfu không chọn block được...
- Lệnh Cfu không chọn block được thì bác hỏi bác Hoành chứ.
- Còn chuyển mã trước hay sau khi phá block time cũng như nhau thôi. Đôi khi chuyển sau khi phá còn nhanh hơn vì bạn chỉ cần mở layer có font lỗi lên chuyển là được.
-
28 phút trước, huunhantvxdts đã nói:Ý là muốn đo bán kính của cung tròn đó chứ ko phải text.
Sau khi filett xong không phải chọn lại đối tượng mà nó đo luôn.
Chứ bạn tạo text rồi pick điểm đến thì dùng lệnh đo bán kính rồi pick chọn cung nó đẹp hơn
Ở đây ý mình là filett xong không chọn chi hết nó đo luôn bán kính
Cám ơn bạn nhiều
Nếu bạn muốn như vậy thì khi dim radius Thì dù sao cũng phải có thông tin về vị trí ghi kích thước.
Bạn biết lisp nên mình cũng chỉ nói ý tưởng vì viết cũng khá rắc rối.
- Lệnh Fillet 2 polyline thì nó sẽ tạo ra 1 polyline có ename là ename của polyline đầu.
- Vì vậy bạn nên lấy dữ liệu polyline đầu. Sau lệnh fillet thì kiểm tra thay đổi để xác định đoạn cung tròn để ghi kích thước.
VD:
(setq en1 (entsel)
old (entget(car(entsel))))
(command "fillet" en1 pause)
(setq new(entget(car(entsel))))
(.... So sánh old vs new xác định arc để ghi dim cung tròn...)
(có thể Dùng các Hàm như vlax-curve-getClosestPointTo, vlax-curve-getParamAtPoint để xác định đoạn nào cùa polyline trước sau fillet để định vị cung tròn)
-
2 giờ trước, Black_Cat_ đã nói:Em làm bản đồ địa chính có một block, trong block bao gồm các đối tượng là: số tờ, số thửa, DTKV, chủ nhà tên đường.... Giờ em muốn lấy thông tin của từng loại ví dụ như số thử ra thành layer thửa , số tờ thành layer số tờ, DTKV là thành DTKV , chủ nhà thành layer chủ nhà.....vv..vv . có cách nào phá block ra mà các thông tin nó ra từng layer được không ạ, em đã thử dùng lệnh x nhưng thông tin nó bị mất đi....Em xin cảm ơn, đây là file cad ạ
Thừ lisp này nó export att ra các layer theo tab
- 1
-
Bác viết hàm giống lệnh fillet luôn rồi thì cần gì biến bkinh nữa. Nó có biến filletrad rồi mà
Nếu bác muốn đọc bkinh thì (getvar 'filletrad) là được.
Còn bác muốn điền bán kính bằng text hay dim thì bạn thêm lệnh command đó vào vì dù sao cũng cần có vị trí đặt text.
Ví dụ như chèn text. Mình tao text ở vị trí '(0 0 0) rồi move lên
(defun c:vbk(/ ent) (command "fillet" "r" pause) (While (/= (getvar 'cmdactive) 0) (command pause)) (command "fillet" pause pause) (command "text" '(0 0 0) "" "" (rtos (getvar 'filletrad) 2 2) "") (command "move" (entlast) "" '(0 0 0) pause))
-
-
Nhờ các anh giúp
trong AutoLisp
Gần giống ở đây
-
mình đã thêm rùi mà.. nó sửa dược file mình vừa mở thôi bạn
- Mình mới test thử thì các file vùa mở nó đều chuyển thành unitless.
Thêm vào startup suite thì nó sẽ load lisp sau khi mở file. Mà lisp nó chuyển sang unitless và qsave
Không biết tại sao mình chèn code nó mất linh tinh nên mình chèn lại file lsp
42 phút trước, Gia phuc đã nói:- 1
-
17 phút trước, Gia phuc đã nói:mình thấy không chuyển được nhiều file bạn
Bạn thử thêm vào startup suite chưa?
Thêm vào thì bạn mở file nào thì nó tự chuyển và save lại. Bạn chỉ cần mở hết 1 lần rồi tăt thôi.
-
Thừ lisp sau
- Nó export tất cả layout vào thư mục mặc định của bản vẽ hiện hành.
Mình chỉ viết sơ như vậy.
Nêu muốn chọn nhiều file thì rắc rối 1 chút.
- Bạn có thể sửa lisp lại 1 chút là thêm 1 dòng (c:test) vào cuối lisp và cho nó vào starup suite. Bạn mở file nào thì nó tự động xuất file đó.
- Xong nhớ xóa vì không cần nó cũng tự động.
Làm vậy cho đơn giản.
- 1
-
Bạn thử dùng lisp sau
(setvar insunits 0) (command "qsave")
- Tải lisp trên vào startup suite.
- Bạn mởi các file cần chuyển rồi thoát. Nó sẽ chuyển cho bạn rồi đó.
- Xóa trong file startup suite đi để khỏi ảnh hưởng lần sau.
ps/ Cái hệ này là dùng để khi chèn các file khác vào nó không scale theo units
- 1
-
1 giờ} trướ}c, ThinhBK đã nói:Tức là như này bác ạ:
- 120 bản vẽ của e đều link đến 1 file xref duy nhất, e đã để chế độ relative path rồi mà khi coppy sang máy khác vẫn không hiển thị, kiểm tra lại hóa ra nó ở chế độ relative path nhưng đường dẫn vẫn là full path (e không hiểu tại sao thế luôn, e thử xref 1 số file khác ở chế độ relative path thì file được file không), thế nên e mới định đổi đường dẫn cho nó từ full path sang relative path: C:\abc thành \\..\\folder, nhưng nếu sửa 120 file thì lâu quá ạ.
- Bác có thể hướng dẫn e dùng reference manager và dùng lisp cho việc này được không ạ!
Thank bác nhiều
- Reference manager là lệnh externalreferences (Ở menu chọn Insert-External References) Dùng quản lý file xref trong cùng 1 file.
- Dùng lisp thì phải biết chút ít về lập trình. Do có 120 files nên bạn chỉ có thể mở từng file hay lập trình cho nó tự động mở.
Còn đoạn mã để nó sửa path lại là:
(vlax-for bb (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'blocks) (if (eq (vla-get-name bb) "XXX") (vla-put-path bb "..\\folder\\xxx.dwg"))) (command "qsave")
XXX: Tên block của file xref
"..\\folder\\xxx.dwg" : Là đường dẫn relative path mà bạn muốn sửa lại.
Dòng cuối là để tự động save lại
Bạn có thể copy đoạn mã trên thành file lsp rồi cho nó load nó thì nó tự sửa và save lại.
Bạn có thể cho load tự động. Mở hết 120 file trên rồi thoát thì nó sửa hết cho bạn. Cái này thì mình chưa thử nhưng mình nghĩ chắc là ok thôi.
-
Sai thì sửa lại.
- Nếu bạn có 1 file mà xref 120 file khác có đuòng dẫn khác nhau thì bạn dùng reference manager sửa lại. Còn có quy luật gì thì bạn nên nói rõ. ví dụ nhủ đổi path từ c:\abc thành d:\def gì đó anh em mới giúp dc.
= Còn 120 file mà file nào cũng có xref riêng thì chỉ có lisp mới tự động sửa 1 lần.
Nếu ko thì bạn chép file xref vào cùng thư mục nó sẽ tụ tìm dc cho bạn.
-
Bạn chỉnh trong dímtyle đó. Units là hệ gì?
-
Viết Lisp thì cũng dễ
.1. Làm theo cách bác @conghoa thì dùng lệnh bắt điểm from. (Có bắt vuông góc là dc.
Lisp :
(defun c:d1() (command "_dimaligned" pause "_from" pause))
2. Có 1 cách nữa là bắt 2 điểm và xét object bằng lệnh nentselp
Lisp:
(defun c:dab(/ p1 p2)
(setq p1 (getpoint "Get start point:")
p2 (getpoint "Get end point:"))
(command "_dimaligned" p1 "non"
(vlax-curve-getclosestpointto (vlax-ename->vla-object (car (nentselp p1))) p2) pause))Lisp sau mình để chuẩn wcs. Nếu ucs ko phải Wcs thì dùng thêm lệnh trans.
-
Khi bạn chọn stretch thi chọn hướng +/- 90 độ
- 1
-
5 giờ trước, anhGeodesy đã nói:Không biết bạn thường vẽ như thế nào nhưng nếu bạn muốn check tổng thì thay đổi L thành L tổng. Thay đổi L1 sẽ ko thay đổi L tổng,
Ví dụ
Mình sửa lại 1 chút cho dễ sử dụng
- 1
Nhờ mọi người viết hộ em cái Lisp di chuyển hàng loạt đối tượng.
trong AutoLisp
Đã đăng · Trả lời báo cáo
còn phương ăn arc rớt trúng đỉnh pline nữa