Chuyển đến nội dung
Diễn đàn CADViet
Kỹ sư

[Yêu cầu] Lisp ghi kích thước Polyline ra text

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

Các bác có thể viết cho em 1 cái lisp nho nhỏ như thế này đc k0 ạ:

Đầu tiên là em có 1 bản vẽ chi tiết của 1 tấm thép với hình bất kì, và với rất nhiều đường đim, nhưng công việc ở đây chỉ chú ý đến 2 đường dim "X" và "Y', là 2 đường đim kích thước của tấm thép hình chữ nhật bao xung quanh tấm thép đang quan tâm

PLATE.png

Công việc của em lúc này là thống kê kích thước của tấm thép bao (hình nét đứt) ra text dưới dạng PL"rộng"X"dày"X"dài" (ví dụ, PL400X10X500)

 

Thống kê 1 vài tấm chả sao, nhưng mà nhiều tấm thì 1 là nhàm chán, 2 là dễ nhầm lẫn

 

Vậy các bác có thể viết hộ e 1 cái lisp nho nhỏ như sau đc k0 ạ:

Đâu tiên là pick vào 2 dim X và Y. Các dIm này do nhiều lý do khác nhau, có thể là dim "xịn", dim modified, mtext hay text.

sau đó là hỏi chiều dày tấm (chiều dày không thể hiện trên bản vẽ, nên cái này phải nhập tay thôi)

Sau khi có 3 kích thước đó của tấm thì pick vào 1 text có sẵn để edit text với nội dung là kích thước tấm theo cú pháp trên

 

Chú ý lần nữa là trong cú pháp trên, chiều rộng đến chiều dày rồi mới đến chiều dài, giữa các kích thước có dấu nhân (X) và đằng trước luôn luôn là chữ "PL"

 

Em xin cảm ơn các bác!

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

Bạn có thể thứ

Tên lệnh "CHON"

Cách sử dụng

Pick chọn Dim1 (dùng để lấy chiều dài- giá trị đầu tiên sau chữ PL)

Pick chọn Dim2 (dùng để lấy chiều rộng_giá trị cuối của Text)

Pick chọn text bị thay đổi

(defun c:chon (/ ent1 ent2 ass1 ass2 X1 X2 X day NDnew)
 (setvar "cmdecho" 0)
 (or #day# (setq #day# 10))
 (command "undo" "begin")
 (setq ass1 (cdr(assoc 1 (setq ent1 (entget(car (entsel "\nChon Dim1") )))))
ass2 (cdr(assoc 1 (setq ent2 (entget(car (entsel "\nChon Dim2") )))))
)
 (if (= ass1 "")
(setq X1 (cdr(assoc 42 ent1))) ;;rong
(setq X1 (atof ass1)))
 (if (= ass2 "")
(setq X2 (cdr(assoc 42 ent2)))  ;;dai
(setq X2 (atof ass2)))
 (if (< X2 X1)
(progn
 	(setq X X2
X2 X1
X1 X)
 	))
 (setq #day# (cond ((getreal (strcat "\nNhap chieu day <" (rtos #day# 2 0) ">:")))(#day#)))
 (setq NDnew (strcat "PL" (rtos X1 2 0) "x" (rtos #day# 2 0) "x" (rtos X2 2 0 )))
 (setq dt (entget(car(entsel "\nChon Text"))))
 (entmod(subst (cons 1 NDnew) (assoc 1 dt) dt))
 (command "undo" "end")
 (setvar "cmdecho" 1)
 )

 

uẩy còn vụ Fake dim nữa để mình sửa lại đã

Ok giờ thì xong rồi, hơi loằng ngoằng nhưng nói chung là đủ dùng

Đã sửa lại cú pháp text viết ra là rộng x dày x dài, sorry bạn

Chỉnh sửa theo quansla

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

Bạn có thể thứ

Tên lệnh "CHON"

Cách sử dụng

Pick chọn Dim1 (dùng để lấy chiều dài- giá trị đầu tiên sau chữ PL)

Pick chọn Dim2 (dùng để lấy chiều rộng_giá trị cuối của Text)

Pick chọn text bị thay đổi

(defun c:chon (/ ent1 ent2 ass1 ass2 X1 X2 day NDnew)
 (setvar "cmdecho" 0)
 (or #day# (setq #day# 10))
 (command "undo" "begin")
 (setq ass1 (cdr(assoc 1 (setq ent1 (entget(car (entsel "\nChon Dim1") )))))
ass2 (cdr(assoc 1 (setq ent2 (entget(car (entsel "\nChon Dim2") )))))
)
 (if (= ass1 "")
(setq X1 (cdr(assoc 42 ent1)))
(setq X1 (atof ass1)))
 (if (= ass2 "")
(setq X2 (cdr(assoc 42 ent2)))
(setq X2 (atof ass2)))
 (setq #day# (cond ((getreal (strcat "\nNhap chieu day <" (rtos #day# 2 0) ">:")))(#day#)))
 (setq NDnew (strcat "PL" (rtos X1 2 0 ) "x" (rtos #day# 2 0) "x" (rtos X2 2 0)))
 (setq dt (entget(car(entsel "\nChon Text"))))
 (entmod(subst (cons 1 NDnew) (assoc 1 dt) dt))
 (command "undo" "end")
 (setvar "cmdecho" 1)
 )

 

uẩy còn vụ Fake dim nữa để mình sửa lại đã

Ok giờ thì xong rồi, hơi loằng ngoằng nhưng nói chung là đủ dùng

- Nếu chiều dài luôn lớn hơn (hoặc =) chiều rộng thì làm luôn 1 cặp 2 dim (hàm ssget), không cần phải pick từng chú dim 1 :)

  • 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

- Nếu chiều dài luôn lớn hơn (hoặc =) chiều rộng thì làm luôn 1 cặp 2 dim (hàm ssget), không cần phải pick từng chú dim 1 :)

lúc mới hoàn thiện em cũng nghĩ vậy, nhưng sợ trong quá trình sử dùng nhiều DIm cạnh nhau không tiện lắm, nhưng mà cũng cảm ơn anh, em sẽ tìm hiểu tiếp nếu chủ pic yêu cầu thêm thì hoàn thiện luôn, lúc này thì đang bận rù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

Cảm ơn bác quansla cũng như bác Tue_NV

Em chưa có bàn CAD nào 64bit để cài trên máy ở nhà nên chưa thử lisp của bác quansla đc, để mai em lên cty thử (trên cty lại không có mạng để dùng mới đau cháu chứ)

 

Bác có thể thêm 1 đoạn code để so sánh giá trị của 2 dim, để không cần phải pick các dim theo thứ tự, nhưng lisp tự biết đâu là dim dài, đâu là dim ngắn để tự sắp xếp trong text theo thứ tự ngắn trước dài sau (theo như lisp bác đang viết là dài trước ngắn sau đấy ạ)

 

Cảm ơn bác lần nữa

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

I. Có thể viết đc cái lisp thông minh như thế này không bác quansla:

- Bước 1: pick chọn polyline, pick trên 1 cạnh mà cạnh đó trùng với cạnh ngắn hay cạnh dài của đường polyline hình chữ nhật bao lấy đường polyline gốc. Sau khi pick, lisp sẽ tính được chiều dài của cạnh đó.

- Bước 2: Nếu bản vẽ k0 phải là tỉ lệ 1:1, thì yêu cầu pick vào đường dim (fake dim, hoặc text), hoặc là nhập tay để lấy giá trị yêu cầu thực tế của cạnh đó, từ đó biết thêm đc tỉ lệ của bản vẽ.

Nếu đang là tỉ lệ 1:1 thì bỏ qua bước này.

- Bước 3: lisp tự động tìm đc điểm trên polyline có khoảng cách vuông góc với cạnh vừa đc pick là lớn nhất, và lấy khoảng cách này nhân với tỉ lệ vừa tính được, sẽ ra kích thước của cạnh còn lại.

- Bước 4: So sánh 2 kích thước này để biết đâu là cạnh dài, đâu là cạnh ngắn. Sau đó yêu cầu nhập chiều dày, và viết ra text theo cú pháp ở trên.

 

Thường là các tấm sẽ đầy đủ các kích thước, và em sẽ chỉ việc pick ra 2 dim đường bao là đc, Nhưng trong 1 số trường hợp, bản vẽ bị thiếu chi tiết và chỉ có 1 kích thước của đường bao thì nếu có lisp như trên thì quả là tiện dụng quá đi.

 

II. Nếu bác viết đc cái lisp như thế, bác thêm cho e 1 chức năng với lệnh khác, để em có thể bổ sung các kích thước còn thiếu của bản vẽ chi tiết với tỉ lệ bất kì, k0 phải là 1;1.

Cụ thể như sau, cũng với cách xác định đc tỉ lệ đang vẽ cho chi tiết đó. Để bổ sung các kích thước còn thiếu, yêu cầu chọn 2 điểm cần đo khoảng cách hoặc đoạn thẳng cần đo, sau khi xác định được khoảng cách giữa 2 điểm hoặc chiều dài đường thẳng, nhân với tỉ lệ vừa tính được và pick chọn text hoặc dim cần sửa với giá trị vừa tính đc.

 

Tính em vốn lười nhác, nhất là làm mấy cái công việc nhàm chán như thế này :D.

Rất mong nhận được sự giúp đỡ của các bác

Em xin cảm ơ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

Theo em, nếu như việc tìm ra 1 điểm trên Polyline có khoảng cách đến cạnh vừa chọn là xa nhất phức tạp quá, thì bác có thể viết lisp với yêu cầu như mục II., tức là để bổ sung đường kích thước còn thiếu, sau đó sẽ thống kê với lisp đầu tiên như bác đã viết

 

Thanks!

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

Mục I. Có thể viết đc cái lisp thông minh như thế này không bác quansla:

- Bước 1: pick chọn polyline, pick trên 1 cạnh mà cạnh đó trùng với cạnh ngắn hay cạnh dài của đường polyline hình chữ nhật bao lấy đường polyline gốc. Sau khi pick, lisp sẽ tính được chiều dài của cạnh đó.

- Bước 2: Nếu bản vẽ k0 phải là tỉ lệ 1:1, thì yêu cầu pick vào đường dim (fake dim, hoặc text), hoặc là nhập tay để lấy giá trị yêu cầu thực tế của cạnh đó, từ đó biết thêm đc tỉ lệ của bản vẽ.

Nếu đang là tỉ lệ 1:1 thì bỏ qua bước này.

- Bước 3: lisp tự động tìm đc điểm trên polyline có khoảng cách vuông góc với cạnh vừa đc pick là lớn nhất, và lấy khoảng cách này nhân với tỉ lệ vừa tính được, sẽ ra kích thước của cạnh còn lại.

- Bước 4: So sánh 2 kích thước này để biết đâu là cạnh dài, đâu là cạnh ngắn. Sau đó yêu cầu nhập chiều dày, và viết ra text theo cú pháp ở trên.

 

Thường là các tấm sẽ đầy đủ các kích thước, và em sẽ chỉ việc pick ra 2 dim đường bao là đc, Nhưng trong 1 số trường hợp, bản vẽ bị thiếu chi tiết và chỉ có 1 kích thước của đường bao thì nếu có lisp như trên thì quả là tiện dụng quá đi.

 

Mục II. Nếu bác viết đc cái lisp như thế, bác thêm cho e 1 chức năng với lệnh khác, để em có thể bổ sung các kích thước còn thiếu của bản vẽ chi tiết với tỉ lệ bất kì, k0 phải là 1;1.

Cụ thể như sau, cũng với cách xác định đc tỉ lệ đang vẽ cho chi tiết đó. Để bổ sung các kích thước còn thiếu, yêu cầu chọn 2 điểm cần đo khoảng cách hoặc đoạn thẳng cần đo, sau khi xác định được khoảng cách giữa 2 điểm hoặc chiều dài đường thẳng, nhân với tỉ lệ vừa tính được và pick chọn text hoặc dim cần sửa với giá trị vừa tính đc.

 

Tính em vốn lười nhác, nhất là làm mấy cái công việc nhàm chán như thế này :D.

Rất mong nhận được sự giúp đỡ của các bác

Em xin cảm ơn ạ!

Mục I : Có vài ý cần làm rõ:

1./ Dim X luôn nằm theo phương ngang, Dim Y có luôn nằm theo phương đứng không? Như hình vẽ trên bạn đã post...

Có thể có TH khác không? Bạn vui lòng upload file dwg minh hoạ 1 số mẫu tấm mà Lisp sẽ hoạt động trên đó...

2./ Có thể gán chiều dày của tấm cho độ rộng width của đường PL không? Tức là bạn sẽ làm công việc gán chiều dày tấm cho width của đường PL, rồi để Lisp tự làm công việc lấy ra chiều dày tấm và xử lý

3./ Lisp chỉ nhanh khi làm hàng loạt tấm, chứ mỗi lần làm chỉ có mỗi một tấm thì nhanh hơn chẳng bao nhiêu.

 

Mục II : Theo ý của tôi, không nên chơi với kích thước phi tỉ lệ, làm việc với nó thấy chẳng chuyên nghiệp tí nào.

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

thanks bác Tue_NV đã quan tâm!

1./ K0 có quy định dim X, dim Y là dài hay ngắn, ngang hay đứng cả. Hình trên chỉ là ví dụ. Chỉ đơn giản, cái nào dài hơn thì là cạnh dài, cái nào ngắn thì là cạnh ngắn.

Bây h e đang ở nhà, không có file .dwg nào cả, cũng k0 có CAD để vẽ. Tối em mới có thể upload đc ạ.

2./ và 3./ Vấn đề của em là mỗi bản vẽ cũng không phải là có nhiều tấm thép, vài ba cái thôi ạ, vấn đề ở chỗ là có nhiều bản vẽ như thế. Mà công việc gõ tay nhiều, dễ dẫn đến nhầm lẫn, sai sót.

 

Mục II:/ Vì lý do sắp xếp bản vẽ, mà không cần chú ý đến tỉ lệ, chỉ cần con số thể hiện là được, nên hầu hết các tấm đều được vẽ, dim, fakedim hoặc break rồi scale theo tỉ lệ bất kì để sắp xếp vào bản vẽ. Và nếu là do em vẽ, thì e sẽ thống kê trước khi scale

 

Thanks!

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

I. Có thể viết đc cái lisp thông minh như thế này không bác quansla:

- Bước 1: pick chọn polyline, pick trên 1 cạnh mà cạnh đó trùng với cạnh ngắn hay cạnh dài của đường polyline hình chữ nhật bao lấy đường polyline gốc. Sau khi pick, lisp sẽ tính được chiều dài của cạnh đó.

- Bước 2: Nếu bản vẽ k0 phải là tỉ lệ 1:1, thì yêu cầu pick vào đường dim (fake dim, hoặc text), hoặc là nhập tay để lấy giá trị yêu cầu thực tế của cạnh đó, từ đó biết thêm đc tỉ lệ của bản vẽ.

Nếu đang là tỉ lệ 1:1 thì bỏ qua bước này.

- Bước 3: lisp tự động tìm đc điểm trên polyline có khoảng cách vuông góc với cạnh vừa đc pick là lớn nhất, và lấy khoảng cách này nhân với tỉ lệ vừa tính được, sẽ ra kích thước của cạnh còn lại.

- Bước 4: So sánh 2 kích thước này để biết đâu là cạnh dài, đâu là cạnh ngắn. Sau đó yêu cầu nhập chiều dày, và viết ra text theo cú pháp ở trên.

 

Thường là các tấm sẽ đầy đủ các kích thước, và em sẽ chỉ việc pick ra 2 dim đường bao là đc, Nhưng trong 1 số trường hợp, bản vẽ bị thiếu chi tiết và chỉ có 1 kích thước của đường bao thì nếu có lisp như trên thì quả là tiện dụng quá đi.

 

II. Nếu bác viết đc cái lisp như thế, bác thêm cho e 1 chức năng với lệnh khác, để em có thể bổ sung các kích thước còn thiếu của bản vẽ chi tiết với tỉ lệ bất kì, k0 phải là 1;1.

Cụ thể như sau, cũng với cách xác định đc tỉ lệ đang vẽ cho chi tiết đó. Để bổ sung các kích thước còn thiếu, yêu cầu chọn 2 điểm cần đo khoảng cách hoặc đoạn thẳng cần đo, sau khi xác định được khoảng cách giữa 2 điểm hoặc chiều dài đường thẳng, nhân với tỉ lệ vừa tính được và pick chọn text hoặc dim cần sửa với giá trị vừa tính đc.

 

Tính em vốn lười nhác, nhất là làm mấy cái công việc nhàm chán như thế này :D.

Rất mong nhận được sự giúp đỡ của các bác

Em xin cảm ơn ạ!

 

Sau mấy hôm mày mò, cắt ghép, mặc dù không hiểu cho lắm, em cũng ghép đc cái lisp để vẽ bản vẽ không có tỉ lệ cố định như sau:

 

(defun c:tl (/ ss dt1 e_record e_type kt1 ass1 ktt1)
;1.\ Chon doi tuong goc:
(setq ss (ssget))
(setq dt1 (ssname ss 0))
(setq e_record (entget dt1))
(setq e_type (cdr (assoc '0 e_record)))
(cond ((wcmatch e_type "LINE,POLYLINE")
(command "lengthen" dt1 "")
(setq kt1 (getvar "PERIMETER"))
)
)
;2.\ chon kich thuoc that cua doi tuong goc:
  (setq ass1 (cdr(assoc 1 (setq ent1 (entget(car (entsel "\nChon Dim1 ")))))))
 (if (= ass1 "")
(setq ktt1 (cdr(assoc 42 ent1)))
(setq ktt1 (atof ass1)))
;3.\ Tinh ti le:
(setq tilex (/ kt1 ktt1))
)
(defun c:xd (/ ss dt2 e_record e_type kt2 ktt2)
;1.\ Chon doi tuong can do:
(setq ss (ssget))
(setq dt2 (ssname ss 0))
(setq e_record (entget dt2))
(setq e_type (cdr (assoc '0 e_record)))
(cond ((wcmatch e_type "LINE,POLYLINE")
(command "lengthen" dt2 "")
(setq kt2 (getvar "PERIMETER"))
)
)
;2.\ kich thuoc that can do:
(setq ktt2 (rtos (/ kt2 TILEX) 2 0))
;3.\ Ghi ket qua:
(prompt "\nChon chu can ghi ket qua:")
(vla-put-textstring (vlax-ename->vla-object (ssname (ssget '((0 . "TEXT"))) 0)) ktt2)
)

 

Nói chung là dùng để bổ sung các kích thước cho bản vẽ đã bị scale thì cũng ổn.

Có điều phải vẽ 1 đường kích thước cần đo, break 2 lần rồi pick và đường dim xong pick vào text để sửa, cũng hơi mất công.

Các bác có thể sửa hộ em, sao có thể chọn 2 điểm cần đo khoảng cách thì vẽ ra 1 đường kích thước luôn, với số liệu lấy từ tỉ lệ đã lấy từ phần trên đc k0 ạ.

 

Cảm ơn các bác!

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

 

Sau mấy hôm mày mò, cắt ghép, mặc dù không hiểu cho lắm, em cũng ghép đc cái lisp để vẽ bản vẽ không có tỉ lệ cố định như sau:

 

...

Nói chung là dùng để bổ sung các kích thước cho bản vẽ đã bị scale thì cũng ổn.

Có điều phải vẽ 1 đường kích thước cần đo, break 2 lần rồi pick và đường dim xong pick vào text để sửa, cũng hơi mất công.

Các bác có thể sửa hộ em, sao có thể chọn 2 điểm cần đo khoảng cách thì vẽ ra 1 đường kích thước luôn, với số liệu lấy từ tỉ lệ đã lấy từ phần trên đc k0 ạ.

 

Cảm ơn các bác!

hi cái này thì nằm ngoài khả năng của mình rùi, nhiều vấn đề quá có quá nhiều bài toán phải xử lý, mà khả năng của mình thì hạn chế hi vọng có người giúp bạn, nhưng mà theo mình thì cứ làm thủ công: pick dim1>>pick dim2>>nhập Text độ dày(hoặc enter để sử dùng độ dày cũ)> chọn Text thay thế(hoặc chọn vị trị đặt Text mới)>>>Kết quả : text là "PL rộng x dày x dài"

hoặc là quét chọn một lần (hai và chỉ hai Dim) lisp tự lựa chọn và xuất kết quả tương tự

Hoặc nếu không thì quét chọn(nhiều dim cũng được) lisp tự lựa chọn 2 dim Vuông góc thỏa mãn: dài nhất và vuông góc hoặc ngắn nhất và vuông góc>>>>xuất kết quả

Còn cách làm của bạn với cái hình như thế này thì viết code mệt lắm

11.png

Bác có thể thêm 1 đoạn code để so sánh giá trị của 2 dim, để không cần phải pick các dim theo thứ tự, nhưng lisp tự biết đâu là dim dài, đâu là dim ngắn để tự sắp xếp trong text theo thứ tự ngắn trước dài sau (theo như lisp bác đang viết là dài trước ngắn sau đấy ạ)

Đã sửa bạn nhé rộng trước dài sau( rộng x dày x dài) Code như bài trên

Sửa chọn 2 dim lisp tự xử lý tiếp, nghe không hay lắm, nhưng mà không có thời gian cải thiện, hi vọng mem Cad sửa típ dùm( hì hì, ) Code như sau:

(defun c:chon (/ ent1 ent2 ass1 ass2 X1 X2 X day NDnew)
 (setvar "cmdecho" 0)
 (or #day# (setq #day# 10))
 ;(command "undo" "begin")

 (setq ss (ssget(list (cons 0 "DIMENSION"))))
 (while (/= 2 (sslength ss))
(setq ss (ssget(list (cons 0 "DIMENSION"))))
)
 (setq ent1 (entget(ssname ss 0))
ent2 (entget(ssname ss 1)))
 (setq ass1 (cdr(assoc 1 ent1))
ass2 (cdr(assoc 1 ent2)))
 (if (= ass1 "")
(setq X1 (cdr(assoc 42 ent1))) ;;rong
(setq X1 (atof ass1)))
 (if (= ass2 "")
(setq X2 (cdr(assoc 42 ent2)))  ;;dai
(setq X2 (atof ass2)))
 (if (< X2 X1)
(progn
 	(setq X X2
	X2 X1
	X1 X)
 	))
 (setq #day# (cond ((getreal (strcat "\nNhap chieu day <" (rtos #day# 2 0) ">:")))(#day#)))
 (setq NDnew (strcat "PL" (rtos X1 2 0) "x" (rtos #day# 2 0) "x" (rtos X2 2 0 )))
 (setq dt (entget(car(entsel "\nChon Text"))))
 (entmod(subst (cons 1 NDnew) (assoc 1 dt) dt))
 ;(command "undo" "end")
 (setvar "cmdecho" 1)
 )

Chỉnh sửa theo quansla
  • 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

Cảm ơn bác!

Em vẫn biết là với vấn đề lisp tự tính toán chiều dài cạnh còn lại sẽ là rất phức tạp hơn nhiều.

nên em mới chuyển phương án là bổ sung kích thước còn thiều sau đó sẽ dùng lisp thống kê trên kia của bác.

Và em đã chế ra cái lisp ở trên, tự tính toán tỉ lệ sau khi bị scale so với kích thước nguyên thủy, từ đó đưa ra kích thước cần tính toán của cạnh đang thiếu

Phần quan trọng nhất của lisp đó em "ăn cắp" từ lisp của bác đấy ạ

 

Có điều cái lisp của e, phải vẽ 1 dim thật, break 2 lần để có 1 line là đường dim và 1 text. Sau khi xác định đc tỉ lệ của bản vẽ, pick vào đường dim để lấy chiều dài của nó, rồi chia cho tỉ lệ vừa xác định đc để xác định kích thước thật cần tính.

 

E thấy nó hơi bất tiện, bác có thể sửa cho em, hoặc là dim 1 phát ra kích thước cần tính, hoặc sửa trực tiếp giá trị dim mà k0 phải break dim mà sửa TEXT

 

Thanks!

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

Cảm ơn bác!

Em vẫn biết là với vấn đề lisp tự tính toán chiều dài cạnh còn lại sẽ là rất phức tạp hơn nhiều.

nên em mới chuyển phương án là bổ sung kích thước còn thiều sau đó sẽ dùng lisp thống kê trên kia của bác.

Và em đã chế ra cái lisp ở trên, tự tính toán tỉ lệ sau khi bị scale so với kích thước nguyên thủy, từ đó đưa ra kích thước cần tính toán của cạnh đang thiếu

Phần quan trọng nhất của lisp đó em "ăn cắp" từ lisp của bác đấy ạ

 

Có điều cái lisp của e, phải vẽ 1 dim thật, break 2 lần để có 1 line là đường dim và 1 text. Sau khi xác định đc tỉ lệ của bản vẽ, pick vào đường dim để lấy chiều dài của nó, rồi chia cho tỉ lệ vừa xác định đc để xác định kích thước thật cần tính.

 

E thấy nó hơi bất tiện, bác có thể sửa cho em, hoặc là dim 1 phát ra kích thước cần tính, hoặc sửa trực tiếp giá trị dim mà k0 phải break dim mà sửa TEXT

 

Thanks!

Chính xác thì em thua tuổi bác rất nhiều, thấy bác không những nhiệt tình tìm tòi mà rất sáng tạo, em rất phục bác, do chưa có nhiều kiến thức về list nên bác còn thiếu nhiều công cụ và thuật toán của bài toán,

Tuy trình độ có hạn nhưng em xin giúp bác mấy cái này, sau này có gặp phải bác dễ giải quyết hơn, và cũng có thêm tinh thần yêu lisp thích list (như em, hì hì)

Bác cần đọc thêm(ngay trong cadviet.com này thôi)các tài liệu liên quan đến các mã DXF (khá nhiều nhưng từ từ rồi sẽ quen). Với DIM thì mã DXF 42 là mã quy định nguyên mẫu kích thước dim bác có thể dùng chúng để làm khoảng cách đo được (khi chưa fake dim). Cái này sẽ thay thế cho việc bác phải "explore" DIM (sẽ thu được 1 Text + 1 line đường ghi KT, 2 line đường gióng và 2 line arrow) sau đó phải "break" line(đường ghi KT) ở hai điểm giao với Arrow

Cú pháp thì như sau

(setq nguyen_mau (cdr(assoc 42 (entget(car(entsel" chon dim can lay gia tri dim nguyen thuy"))))))

Toàn bộ phần (entget(car(entsel" chon dim can lay gia tri dim nguyen thuy"))) chỉ là để cú pháp trên chạy ngay khi bác paste dòng trên vào Command trên Cad nếu có sẵn đối tượng thì cần khác đi (chút chút)

Bác có thể bổ xung điều kiện chọn để không bị chọn nhầm chọn sai, hoặc cho phép chọn lại khi bị sai

Sau này khi quen dần bác có thể sáng tạo các hàm con list sẽ khoa học, sáng sủa hơn,

Nói sơ sơ vậy, hi vọng bác thêm hứng khởi và tìm hiểu thêm về list

Còn về bài toán của bác: em thử hệ thống lại xem đúng không nhé, bác kiểm tra đúng ý thì em sửa luôn.

1. Về việc thay giá trị Text có sẵn bằng cú pháp "PL rộng x dày x dài" làm như sau:

bước 1 : Pick chọn DIM 1 , Pick chọn DIM2 (hoặc chọn luôn hai giá DIM bằng cách quét chuột). List tự động kiểm tra giá trị dài, rộng để chuẩn bị thay Text, đồng thời Kiểm tra xem tỷ lệ của hình đang xử lý( bằng cách lấy giá trị DIM (đã bị FAKE) chia cho giá trị dim nguyên thủy) lưu tỷ lệ này để tiếp tục bổ xung thêm vài đường DIM khác (nếu cần) theo tỷ lệ này (với điều kiện các DIM này chưa FAKE và cùng tỷ lệ với tỷ lệ của hình đang xử lý vừa lấy ra)

Bước 2: Pick chọn Text cần thay thế(cái này em có thể sửa được là có thể pick chọn Text có sẵn hoặc chọn điểm chèn cho Text mới, tùy ý bác) thay thế theo cú pháp có được ở bước 1

2. Với tỷ lệ tìm được "dùng lệnh gần như "Ma" để sửa lại các DIM còn lại, hoặc để đo thêm DIM khác

nên em mới chuyển phương án là bổ sung kích thước còn thiều sau đó sẽ dùng lisp thống kê trên kia của bác.

Và em đã chế ra cái lisp ở trên, tự tính toán tỉ lệ sau khi bị scale so với kích thước nguyên thủy, từ đó đưa ra kích thước cần tính toán của cạnh đang thiếu

Về cơ bản theo ý hiểu của em là vậy: có điều khi đó nảy sinh một số câu hỏi sau:

1. Tại sao lại có DIM FAKE(do người dùng tự sửa)?>>>>sửa theo nguyên tắc nào. Nếu sửa một cách vô ý,linh tính thì TỶ LỆ NGUYÊN THỦY mà bác nói là vô nghĩa. Nếu sửa nhưng theo nguyên tắc chia tỷ lệ thực (của hình) cho tỷ lệ bản vẽ(xácđịnh) thì tại sao BÁC KHÔNG DÙNG "DIMMENSION STYLE MANAGE" hoặc chỉ cần dùng Ctrl + 1 chỉnh với 1 DIM cụ thể giá trị của biến DIMLFAC(trong mục DIM SCALE LINER) rồi "MA" cho các dim còn lại.

Theo em thì hình của bác là hình vẽ đúng tỷ lệ với các kích thước A,B,C,D,... sau đó dùng lệnh "SCALE" với hệ số tỷ lệ n(hệ số nguyên thủy của bác) chúng trở thành hình với giá trị a,b,c,d,... muốn có lại các giá trị A,B,C,D,..ban đầu bác thay vì dùng "1 cách rất khoa học là dùng DIM Style" thì lại dùng cách thủ công và "sai nguyên tắc" là "EDDIT DIM"(fake dim)

Nếu quả đúng vậy thì cách giải quyết rất đơn giản thực sử không cần lisp và lại áp dụng được cho lần sau.

Nếu bác có file up lên đây, hoặc có thể liên hệ em qua yahoo thì em luôn sẵn sàng giúp đỡ bác

Chúc bác thành công trong công việc, ngày càng yêu thích list hơ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

Cảm ơn bạn đã nhiệt tình quan tâm.

 

Vấn đề của mình ở đây là thống kê vật liệu từ bản vẽ của người khác làm (khách hàng), cho xưởng sản xuất.

Bản vẽ của họ làm từ Tekla, xuất ra CAD, và trong bản vẽ, các đường kích thước chỉ là các line và text chứ k0 phải là đối tượng dimension.

Và các chi tiết bị scale với các tỉ lệ khác nhau, và theo quy luật duy nhất là sao cho sắp xếp đủ các chi tiết vào trong bản vẽ.

 

Và nếu như bên khách hàng làm tốt Tekla thì sẽ k0 có chuyện bản vẽ thiếu các kích thước và phải thống kê lại vật liệu, thế nên mình mới cần lisp để làm việc, chứ làm bằng tay thì k0 ổn tí nào.

 

Mình k0 biết j về lập trình, chỉ là đọc qua mấy cái lisp, đoán chức năng công dụng từng đoạn mã rồi cắt ghép để chế ra cái lisp trên kia thôi.

 

Với cái lisp tự chế trên kia, mình cũng đã có thể bổ sung các đường kích thước còn thiếu, và sau đó là dùng cái lisp của bạn viết hộ để thống kê vật liệu.

Có điều, với mỗi đường kích thước bổ sung, mình phải đo 1 đường dim, break 2 lần để có 1 đường line có chiều dài bằng đoạn cần đo và 1 text,

 

Và bạn có thể sửa cho mình sao cho sau khi mình vẽ ra đường dim, gõ lệnh, pick vào dim vừa vẽ, lisp sẽ lấy chiều dài thực tế của dim đó, chia cho tỉ lệ vừa xác định để ra kích thước cần tìm, rồi sửa (fakedim) luôn cái dim đó với giá trị vừa tính đc.

 

Cảm ơn bạn rất 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

Cảm ơn bạn đã nhiệt tình quan tâm.

 

Vấn đề của mình ở đây là thống kê vật liệu từ bản vẽ của người khác làm (khách hàng), cho xưởng sản xuất.

Bản vẽ của họ làm từ Tekla, xuất ra CAD, và trong bản vẽ, các đường kích thước chỉ là các line và text chứ k0 phải là đối tượng dimension.

Và các chi tiết bị scale với các tỉ lệ khác nhau, và theo quy luật duy nhất là sao cho sắp xếp đủ các chi tiết vào trong bản vẽ.

 

Và nếu như bên khách hàng làm tốt Tekla thì sẽ k0 có chuyện bản vẽ thiếu các kích thước và phải thống kê lại vật liệu, thế nên mình mới cần lisp để làm việc, chứ làm bằng tay thì k0 ổn tí nào.

 

Mình k0 biết j về lập trình, chỉ là đọc qua mấy cái lisp, đoán chức năng công dụng từng đoạn mã rồi cắt ghép để chế ra cái lisp trên kia thôi.

 

Với cái lisp tự chế trên kia, mình cũng đã có thể bổ sung các đường kích thước còn thiếu, và sau đó là dùng cái lisp của bạn viết hộ để thống kê vật liệu.

Có điều, với mỗi đường kích thước bổ sung, mình phải đo 1 đường dim, break 2 lần để có 1 đường line có chiều dài bằng đoạn cần đo và 1 text,

 

Và bạn có thể sửa cho mình sao cho sau khi mình vẽ ra đường dim, gõ lệnh, pick vào dim vừa vẽ, lisp sẽ lấy chiều dài thực tế của dim đó, chia cho tỉ lệ vừa xác định để ra kích thước cần tìm, rồi sửa (fakedim) luôn cái dim đó với giá trị vừa tính đc.

 

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

Up file nhé bác

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

Up file nhé bác

 

Có thể là do mình trình bày hơi khó hiểu.

Mình muốn có 1 cái lisp tương tự như lisp fakedim, nhưng mà giá trị fakedim lấy bằng giá trị thực của dim nhân với 1 tỉ lệ scale đã xác định.

 

 

mình đã tham khảo cái lisp fakedim của bác gia_bach trong topic http://www.cadviet.com/forum/index.php?showtopic=11532

Nhưng k0 biết sửa thế nào cả :D

 

Bạn có thể viết hộ mình cái lisp như thế này đc k0?

 

Phần I: xác định tỉ lệ scale.

Đầu tiên là pick chọn vào line để lấy chiều dài thực a1 của nó

Sau đó, có 2 lựa chọn, hoặc là chọn text có giá trị chiều dài nguyên thủy b1 (chưa bị scale) hoặc nhập tay từ bàn phím

Từ đó xác định đc tỉ lệ scale x bằng cách lấy giá trị thực chia cho giá trị nguyên thủy (x = a1/b1)

Sau khi thực hiện xong lệnh này thì vẫn lưu giá trị tỉ lệ này trong CAD để còn tính toán ở phần II.

 

Phần II: Fakedim với tỉ lệ vừa xác định.

Chọn các đường dim đã vẽ trước (dim chưa fake hay dim đã fake), xác định giá trị thực a2 của dim

Fake dim vừa chọn với giá trị thực a2 chia cho tỉ lệ x vừa xác định ở phần I: b2 = a2/x

 

Mấy hôm rồi bận quá, k0 có thời gian online.

Cảm ơn bạn rất 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

 

Có thể là do mình trình bày hơi khó hiểu.

Mình muốn có 1 cái lisp tương tự như lisp fakedim, nhưng mà giá trị fakedim lấy bằng giá trị thực của dim nhân với 1 tỉ lệ scale đã xác định.

 

 

mình đã tham khảo cái lisp fakedim của bác gia_bach trong topic http://www.cadviet.c...showtopic=11532

Nhưng k0 biết sửa thế nào cả :D

 

Bạn có thể viết hộ mình cái lisp như thế này đc k0?

 

Phần I: xác định tỉ lệ scale.

Đầu tiên là pick chọn vào line để lấy chiều dài thực a1 của nó

Sau đó, có 2 lựa chọn, hoặc là chọn text có giá trị chiều dài nguyên thủy b1 (chưa bị scale) hoặc nhập tay từ bàn phím

Từ đó xác định đc tỉ lệ scale x bằng cách lấy giá trị thực chia cho giá trị nguyên thủy (x = a1/b1)

Sau khi thực hiện xong lệnh này thì vẫn lưu giá trị tỉ lệ này trong CAD để còn tính toán ở phần II.

 

Phần II: Fakedim với tỉ lệ vừa xác định.

Chọn các đường dim đã vẽ trước (dim chưa fake hay dim đã fake), xác định giá trị thực a2 của dim

Fake dim vừa chọn với giá trị thực a2 chia cho tỉ lệ x vừa xác định ở phần I: b2 = a2/x

 

Mấy hôm rồi bận quá, k0 có thời gian online.

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

Bác nói rõ hơn chỗ này đi, hôm nọ bác nói các DIM trong bản vẽ Cad của bác là do soft ngoài tạo ra và nó không phải là DIMMENSION mà là các LINE và TEXT nếu vậy đoạn màu đỏ này có ý nghĩa gì không, bác up file nên đây nhé

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
Bác nói rõ hơn chỗ này đi, hôm nọ bác nói các DIM trong bản vẽ Cad của bác là do soft ngoài tạo ra và nó không phải là DIMMENSION mà là các LINE và TEXT nếu vậy đoạn màu đỏ này có ý nghĩa gì không, bác up file nên đây nhé

Nếu cứ theo yêu cầu ở trên thì bác dùng list này, kiểm tra lại bác nhé

Tên lệnh "THU"

cách dùng

B1, chọn "LINE" (chỉ "LINE" thôi nhé, không thể chọn được cái gì khác LINE <nếu cần em sẽ viết để bác có thể "EXPLORE" phá Polyline trước ra nhưng trước mắt cứ hạn chế quyền này đã)

B2, chọn Text là số (nói là Text, thực ra bác chỉ cần chọn bất cứ cái gì có mã DXF là 1 là được, nếu hiểu CODE list, thì trong CODE em quy định như sau: Xuất phát từ tư tưởng(chỉ chọn Text có sẵn, hoặc DIM có sẵn (fake hoặc chưa fake) bọn này đều có mã DXF 1) khi đó nếu là Text thì lấy bình thường giá trị là hàm (atof (cdr(assoc 1 ..))) nếu là DIM thì kiểm tra nếu DIM là DIM chưa fake thì lấy giá trị của mã DXF 42, nếu là DIM đã FAKE thì nếu có giá trị số thì lấy, nếu giá trị là TEXT thì bỏ qua dùng mã DXF 42)

Đến đây sẽ có thông báo về tỷ lệ đọc được

B3 quét chọn các DIM cần thay đổi (vấn đề là theo bài bác nói trước, bản vẽ của bác vẽ từ soft ngoài thì làm gì có DIM nhỉ) lisp tự tính toán sửa lại các giá trị DIM

*error* lisp của em hiện nay chưa hoàn thiện, chưa cho phép khi ấn ESC sẽ khôi phục lại như trước khi dùng lisp, cái này để em xem lại sau.

Bác dùng và kiểm tra nhé


(defun c:thu ()
 ;;-----
 (defun xuly_nhaptay (a1 / b1_user)
   (setq b1_user (getreal "\nNhap chieu dai mong muon"))
   ( / a1 b1_user )
   )
 ;;-----
 (defun xuly_picktext (a1 Tex / b1)
   (If (= (type (atof(cdr(assoc 1 (entget(car Tex))))) ) (type 3.4))
     (progn
(if (/= "" (cdr(assoc 1 (entget(car Tex)))))
(setq b1 (atof(cdr(assoc 1 (entget(car Tex))))))
(setq b1 (cdr(assoc 42 (entget(car Tex))))) )
)
     )
   (if b1
     ( / a1 b1 )
     ;(xuly_nhaptay)
   )
   )
 ;;-----
 (defun xuly_yeucau_pI_xdtyle( / dt ent_dt a1)
   (while (or (null dt)
     (/= "LINE" (cdr (assoc 0 (entget (car dt))))) )
     (setq dt (entsel"\nChon LINE")))
   (setq ent_dt (entget (car dt)))
   (setq a1 (distance (cdr(assoc 10 ent_dt)) (cdr(assoc 11 ent_dt)) ))
   ;;chon text chua gia tri fake dim hoac nhap tay
   (if (setq picktext (entsel "\nPick chon Text la so"))
     (setq ##tyle## (xuly_picktext a1 picktext))
     (setq ##tyle## (xuly_nhaptay a1))
     )
   (princ (strcat "Tyle ban ve hien xac dinh duoc la : " (rtos ##tyle## 2 5 ) "\n"))
   (princ)
   )
 ;;-----
 (defun xuly_yeucau_PII ( / ss i entdt_ss a2 giatri_new)
   (prompt "\nChon cac duong DIM de converst")
   (princ)
   (setq ss (ssget (list (cons 0 "DIMENSION"))))
   (setq i -1)
   (repeat (sslength ss)
     (command "undo" "begin")
     (setq i (1+ i))
     (setq entdt_ss (entget(ssname ss i)))
     (princ)
     ;;xac dinh gia tri thuc a2 cua dim
     (setq a2 (distance (cdr(assoc 13 entdt_ss)) (cdr(assoc 14 entdt_ss)) ))
     ;; ket thuc a2 xac dinh gia tri moi bang a2/x (x la tyle o phan I)
     (setq giatri_new (rtos (/ a2 ##tyle##)))
     (setq entdt_ss (subst (cons 1 giatri_new) (assoc 1 entdt_ss) entdt_ss))
     (if ( = (atof(cdr(assoc 1 entdt_ss)))
	(cdr(assoc 42 entdt_ss))
	)
(setq entdt_ss (subst (cons 1 "") (assoc 1 entdt_ss) entdt_ss))
nil
)
     (entmod entdt_ss)
     (command "undo" "end")
     );end_repeat
   )
 ;;CHUONG TRINH CHINH
 (setvar "cmdecho" 0)
 (xuly_yeucau_pI_xdtyle)
 (xuly_yeucau_PII)
 (setvar "cmdecho" 1)
 (princ (strcat "Tyle ban ve hien xac dinh duoc la : " (rtos ##tyle## 2 5 ) "\n"))
 (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

Nếu cứ theo yêu cầu ở trên thì bác dùng list này, kiểm tra lại bác nhé

Tên lệnh "THU"

cách dùng

B1, chọn "LINE" (chỉ "LINE" thôi nhé, không thể chọn được cái gì khác LINE <nếu cần em sẽ viết để bác có thể "EXPLORE" phá Polyline trước ra nhưng trước mắt cứ hạn chế quyền này đã)

B2, chọn Text là số (nói là Text, thực ra bác chỉ cần chọn bất cứ cái gì có mã DXF là 1 là được, nếu hiểu CODE list, thì trong CODE em quy định như sau: Xuất phát từ tư tưởng(chỉ chọn Text có sẵn, hoặc DIM có sẵn (fake hoặc chưa fake) bọn này đều có mã DXF 1) khi đó nếu là Text thì lấy bình thường giá trị là hàm (atof (cdr(assoc 1 ..))) nếu là DIM thì kiểm tra nếu DIM là DIM chưa fake thì lấy giá trị của mã DXF 42, nếu là DIM đã FAKE thì nếu có giá trị số thì lấy, nếu giá trị là TEXT thì bỏ qua dùng mã DXF 42)

Đến đây sẽ có thông báo về tỷ lệ đọc được

B3 quét chọn các DIM cần thay đổi (vấn đề là theo bài bác nói trước, bản vẽ của bác vẽ từ soft ngoài thì làm gì có DIM nhỉ) lisp tự tính toán sửa lại các giá trị DIM

*error* lisp của em hiện nay chưa hoàn thiện, chưa cho phép khi ấn ESC sẽ khôi phục lại như trước khi dùng lisp, cái này để em xem lại sau.

Bác dùng và kiểm tra nhé

 

Quên sao yêu cầu của bác xa rời yêu cầu bài #1 thế, nếu vậy đây là hai lisp riêng biệt, xử lý hai công việc khác nhau nhé,và em cũng không khuyến khích dùng list fake dim này cho Cad, nó chỉ có lợi cho việc xử lý công việc trước mắt + không phải lập nhiều tỷ lệ vô lý (hệ số tỷ lệ quá lẻ: 1,3456, 2,23234, ..)

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

Quên sao yêu cầu của bác xa rời yêu cầu bài #1 thế, nếu vậy đây là hai lisp riêng biệt, xử lý hai công việc khác nhau nhé,và em cũng không khuyến khích dùng list fake dim này cho Cad, nó chỉ có lợi cho việc xử lý công việc trước mắt + không phải lập nhiều tỷ lệ vô lý (hệ số tỷ lệ quá lẻ: 1,3456, 2,23234, ..)

 

Thì yêu cầu ở bài #1 đã đc bạn viết cho cho mình 1 cái lisp chon.lsp rồi mà. Lisp đó mình dùng để thống kê rất tiện. Cảm ơn bạn.

 

Từ cái lisp đó của bạn, cộng với một vài lisp khác, mình copy paste , chế ra đc cái lisp dùng để bổ sung kích thước còn thiếu như mình đã post ở trên.

Nhưng mà bất tiện ở chỗ phải break nhiều lần như mình đã nói.

 

Còn về cái lisp thu.lsp bạn vừa viết xong, bạn có thể tách ra làm 2 phần với 2 lệnh riêng biệt. Phần 1 là xác định tỉ lệ, sau khi thực hiện xong thì lưu lại giá trị tỉ lệ này, lúc nào cần xác định lại tỉ lệ thì thực hiện lại lệnh đó, và phần 2 là phần fakedim với tỉ lệ đã xác định.

 

Cũng giống như lisp đánh cốt tự động ấy, có 1 lệnh cot00 để xác định cốt 00, sau đó lệnh dc để đánh cốt tính từ cốt 00 vừa xác định. Sang chỗ khác, cần chọn lại cốt 00 khác thì sẽ dùng lại lệnh cot00.

 

Bạn có thể bỏ 1 chút thời gian xem qua cái lisp của mình đc k0? Xem thì bạn sẽ hiểu rõ hơn yêu cầu của mình.

 

Các bản vẽ của mình xuẩt ra từ phần mềm khác, ko có dim, chỉ có text và có line. Nhưng để bổ sung đường kích thước thì mình sẽ dim chỗ cần bổ sung rồi edit cái dim đó.

Với cái lisp của mình tự chế thì mình sẽ phải break 2 lần thì mới sửa đc.

 

Và mình muốn có 1 cái lisp, sau khi xác định đc tỉ lệ bằng 1 lệnh khác, mình gõ lệnh thì chọn vào đường dim, nếu dim đã bị fake thì cũng k0 quan tâm giá trị đã fake (có thể có do trường hợp xác định sai tỉ lệ, và cần fake lại), Lisp sẽ lấy giá trị thực của dim để chia (hoặc nhân, tùy thuật toán) với tỉ lệ đã xác định đc rồi fake

 

Cảm ơn bạn đã rất nhiệt tình giúp mình.

Bạn sn 90, chắc bạn vừa mới ra trường nhỉ?

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

Còn về cái lisp thu.lsp bạn vừa viết xong, bạn có thể tách ra làm 2 phần với 2 lệnh riêng biệt. Phần 1 là xác định tỉ lệ, sau khi thực hiện xong thì lưu lại giá trị tỉ lệ này, lúc nào cần xác định lại tỉ lệ thì thực hiện lại lệnh đó, và phần 2 là phần fakedim với tỉ lệ đã xác định.

 

Cũng giống như lisp đánh cốt tự động ấy, có 1 lệnh cot00 để xác định cốt 00, sau đó lệnh dc để đánh cốt tính từ cốt 00 vừa xác định. Sang chỗ khác, cần chọn lại cốt 00 khác thì sẽ dùng lại lệnh cot00.

 

Bạn có thể bỏ 1 chút thời gian xem qua cái lisp của mình đc k0? Xem thì bạn sẽ hiểu rõ hơn yêu cầu của mình.

 

Các bản vẽ của mình xuẩt ra từ phần mềm khác, ko có dim, chỉ có text và có line. Nhưng để bổ sung đường kích thước thì mình sẽ dim chỗ cần bổ sung rồi edit cái dim đó.

Với cái lisp của mình tự chế thì mình sẽ phải break 2 lần thì mới sửa đc.

 

Và mình muốn có 1 cái lisp, sau khi xác định đc tỉ lệ bằng 1 lệnh khác, mình gõ lệnh thì chọn vào đường dim, nếu dim đã bị fake thì cũng k0 quan tâm giá trị đã fake (có thể có do trường hợp xác định sai tỉ lệ, và cần fake lại), Lisp sẽ lấy giá trị thực của dim để chia (hoặc nhân, tùy thuật toán) với tỉ lệ đã xác định đc rồi fake

 

Cảm ơn bạn đã rất nhiệt tình giúp mình.

Bạn sn 90, chắc bạn vừa mới ra trường nhỉ?

Hix, học hành bét nhé như e chưa ra được anh ạ, mấy hôm tiếp thì lại bận rồi, còn list thử của em mỗi yêu cầu, bác bỏ ra làm lệnh đều được mà,

;;cac ham con
 ;;-----
 (defun xuly_nhaptay (a1 / b1_user)
(setq b1_user (getreal "\nNhap chieu dai mong muon"))
( / a1 b1_user )
)
 ;;-----
 (defun xuly_picktext (a1 Tex / b1)
(If (= (type (atof(cdr(assoc 1 (entget(car Tex))))) ) (type 3.4))
 	(progn
(if (/= "" (cdr(assoc 1 (entget(car Tex)))))
  (setq b1 (atof(cdr(assoc 1 (entget(car Tex))))))
  (setq b1 (cdr(assoc 42 (entget(car Tex))))) )
)
 	)
(if b1
 	( / a1 b1 )
 	;(xuly_nhaptay)
)
)
 ;;-----
 (defun xuly_yeucau_pI_xdtyle( / dt ent_dt a1)
(while (or (null dt)
   	(/= "LINE" (cdr (assoc 0 (entget (car dt))))) )
 	(setq dt (entsel"\nChon LINE")))
(setq ent_dt (entget (car dt)))
(setq a1 (distance (cdr(assoc 10 ent_dt)) (cdr(assoc 11 ent_dt)) ))
;;chon text chua gia tri fake dim hoac nhap tay
(if (setq picktext (entsel "\nPick chon Text la so"))
 	(setq ##tyle## (xuly_picktext a1 picktext))
 	(setq ##tyle## (xuly_nhaptay a1))
 	)
(princ (strcat "Tyle ban ve hien xac dinh duoc la : " (rtos ##tyle## 2 5 ) "\n"))
(princ)
)
 ;;-----
 ;;-----
 (defun xuly_yeucau_PII ( / ss i entdt_ss a2 giatri_new)
(prompt "\nChon cac duong DIM de converst")
(princ)
(setq ss (ssget (list (cons 0 "DIMENSION"))))
(setq i -1)
(repeat (sslength ss)
 	(command "undo" "begin")
 	(setq i (1+ i))
 	(setq entdt_ss (entget(ssname ss i)))
 	(princ)
 	;;xac dinh gia tri thuc a2 cua dim
 	(setq a2 (distance (cdr(assoc 13 entdt_ss)) (cdr(assoc 14 entdt_ss)) ))
 	;; ket thuc a2 xac dinh gia tri moi bang a2/x (x la tyle o phan I)
 	(setq giatri_new (rtos (/ a2 ##tyle##)))
 	(entmod (subst (cons 1 giatri_new) (assoc 1 entdt_ss) entdt_ss))
 	(command "undo" "end")
 	);end_repeat
)
 ;;CHUONG TRINH CHINH
(defun c:thu1 ()
 (xuly_yeucau_pI_xdtyle)
 )
(defun c:thu2 () 
 (setvar "cmdecho" 0)
 ;(xuly_yeucau_pI_xdtyle)
 (xuly_yeucau_PII)
 (setvar "cmdecho" 1)
 (princ (strcat "Tyle ban ve hien xac dinh duoc la : " (rtos ##tyle## 2 5 ) "\n"))
 (princ) 
 )

List của bác em trước xem rồi, nhưng mà đã nói bác up file bác không up thì em chịu hông viết được, bác up file lên đi

Mấu chốt là các DIM của bác đã bị Scale thì mỗi dim ở tỷ lệ khác nhau có Arrow khác nhau mà đúng khô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

Hix, học hành bét nhé như e chưa ra được anh ạ, mấy hôm tiếp thì lại bận rồi, còn list thử của em mỗi yêu cầu, bác bỏ ra làm lệnh đều được mà,

;;cac ham con
 ;;-----
 (defun xuly_nhaptay (a1 / b1_user)
(setq b1_user (getreal "\nNhap chieu dai mong muon"))
( / a1 b1_user )
)
 ;;-----
 (defun xuly_picktext (a1 Tex / b1)
(If (= (type (atof(cdr(assoc 1 (entget(car Tex))))) ) (type 3.4))
 	(progn
(if (/= "" (cdr(assoc 1 (entget(car Tex)))))
  (setq b1 (atof(cdr(assoc 1 (entget(car Tex))))))
  (setq b1 (cdr(assoc 42 (entget(car Tex))))) )
)
 	)
(if b1
 	( / a1 b1 )
 	;(xuly_nhaptay)
)
)
 ;;-----
 (defun xuly_yeucau_pI_xdtyle( / dt ent_dt a1)
(while (or (null dt)
   	(/= "LINE" (cdr (assoc 0 (entget (car dt))))) )
 	(setq dt (entsel"\nChon LINE")))
(setq ent_dt (entget (car dt)))
(setq a1 (distance (cdr(assoc 10 ent_dt)) (cdr(assoc 11 ent_dt)) ))
;;chon text chua gia tri fake dim hoac nhap tay
(if (setq picktext (entsel "\nPick chon Text la so"))
 	(setq ##tyle## (xuly_picktext a1 picktext))
 	(setq ##tyle## (xuly_nhaptay a1))
 	)
(princ (strcat "Tyle ban ve hien xac dinh duoc la : " (rtos ##tyle## 2 5 ) "\n"))
(princ)
)
 ;;-----
 ;;-----
 (defun xuly_yeucau_PII ( / ss i entdt_ss a2 giatri_new)
(prompt "\nChon cac duong DIM de converst")
(princ)
(setq ss (ssget (list (cons 0 "DIMENSION"))))
(setq i -1)
(repeat (sslength ss)
 	(command "undo" "begin")
 	(setq i (1+ i))
 	(setq entdt_ss (entget(ssname ss i)))
 	(princ)
 	;;xac dinh gia tri thuc a2 cua dim
 	(setq a2 (distance (cdr(assoc 13 entdt_ss)) (cdr(assoc 14 entdt_ss)) ))
 	;; ket thuc a2 xac dinh gia tri moi bang a2/x (x la tyle o phan I)
 	(setq giatri_new (rtos (/ a2 ##tyle##)))
 	(entmod (subst (cons 1 giatri_new) (assoc 1 entdt_ss) entdt_ss))
 	(command "undo" "end")
 	);end_repeat
)
 ;;CHUONG TRINH CHINH
(defun c:thu1 ()
 (xuly_yeucau_pI_xdtyle)
 )
(defun c:thu2 ()
 (setvar "cmdecho" 0)
 ;(xuly_yeucau_pI_xdtyle)
 (xuly_yeucau_PII)
 (setvar "cmdecho" 1)
 (princ (strcat "Tyle ban ve hien xac dinh duoc la : " (rtos ##tyle## 2 5 ) "\n"))
 (princ)
 )

List của bác em trước xem rồi, nhưng mà đã nói bác up file bác không up thì em chịu hông viết được, bác up file lên đi

Mấu chốt là các DIM của bác đã bị Scale thì mỗi dim ở tỷ lệ khác nhau có Arrow khác nhau mà đúng không

 

Sory, mấy hôm rồi mình có việc, h mới về HN nên mới online cảm ơn bạn đc.

cái lisp của bạn mình dùng okie rồi. Chỉ có không dùng được cho ordinate dimension thôi, Mà thực ra Ordinate dim cũng ít dùng nên cũng không cần thiết lắm

 

Mình k0 up file là vì 2 lí do:

1./ MÌnh mà muốn up file thì phải lên công ty, gửi qua email rồi tối về mới up đc, rất mất công. Công ty mình chặn k0 cho xài internet mà.

2./ Thực ra thì bản vẽ cũng k0 có j đặc biệt, nhất là chỗ liên quan đến cái lisp này. Chỉ là vẽ chi tiết các tấm thép, và các đường kích thước chỉ là line và text, thế thôi.

Chân thành cảm ơn bạn đã nhiệt tình giúp mình.

Chúc bạn sức khỏe và thành công trong học tập cũng như công việc!

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

Mình là thành viên mới nên không biết gửi thông tin cần hỏi ở đâu nên xin phép được hỏi ở đây, mong admin thông cảm.

 

Nhờ mọi người giúp đỡ viết lisp vẽ hình chữ nhật, chương trình sẽ hỏi chiều rộng (W) và chiều cao (H) hình chữ nhật. Khi vẽ thì cad chỉ cần vẽ ra theo chiều rộng mà chương trình đã hỏi,chiều dài là do mình click chuột trên bản vẽ, không cần chiều cao. Vẽ xong sẽ xuất text WxH với chiều cao chữ sẽ được chương trình lisp hỏi (vẽ lần sau thì chương trình tự nhớ chiều cao chữ,nếu muốn thay đổi thì mình mới đánh lại chiều cao chữ)

 

Xin cảm ơn mọi ngườ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

×