Đến nội dung


Hình ảnh
- - - - -

Xuất file *.txt cho chiều dài các cạnh


  • Please log in to reply
22 replies to this topic

#1 thuong_mdc80

thuong_mdc80

    biết vẽ line

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

Đã gửi 17 April 2009 - 06:41 PM

Chào các Anh/ chị.
- Tôi có bản vẽ mà các điểm đã được nối lại thành các Line. Nhờ Anh/ chị viết giúp tôi Lisp để thống kê và xuất ra file dạng *.txt gồm: điểm đầu, điểm cuối của mỗi cạnh và chiều dài các cạnh đó.
- Các bác xem file đính kèmVisit My Website
Cảm ơn.
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 17 April 2009 - 07:07 PM

Chào các Anh/ chị.
- Tôi có bản vẽ mà các điểm đã được nối lại thành các Line. Nhờ Anh/ chị viết giúp tôi Lisp để thống kê và xuất ra file dạng *.txt gồm: điểm đầu, điểm cuối của mỗi cạnh và chiều dài các cạnh đó.
- Các bác xem file đính kèmVisit My Website
Cảm ơn.

Tôi có thể viết lisp cho bạn, thời gian viết lisp này chắc chỉ 10 phút là cùng, nhưng tôi không muốn như vậy bởi vấn đề của bạn rất điển hình. Trên diễn đàn CADViet của chúng ta, thời gian gần đây các yêu cầu về viết lisp kết xuất dữ liệu ra bảng, ra excel rất nhiều. Những yêu cầu đó chính đáng, nó giúp rút ngắn thời gian làm việc cho người dùng lisp. Tuy nhiên, những yêu cầu như vậy thật ra các bạn có thể tự làm được bằng chính AutoCAD mà không cần đến lisp.

Dưới đây tôi xin hướng dẫn cách xử lý vấn đề của bạn. Từ đây, mọi người sẽ biết cách kết xuất dữ liệu cho riêng mình mà không cần phải yêu cầu viết lisp nữa.
Đầu tiên, bạn dùng lệnh DATAEXTRACTION (lệnh tắt chuẩn là DX). Tại Data Extraction - Page 1 of 8, nhấn next khi bạn tạo mới (lần đầu), còn khi bạn muốn update dữ liệu (cho các lần sau) thì bạn chọn Edit an existing data extraction. Rồi nhấn Next.
Hình đã gửi

Hộp thoại Save Data Extraction As sẽ xuất hiện yêu cầu bạn tạo mới 1 file dxe. File này có mục đích là lưu các bước mà bạn làm, để lần sau bạn không phải làm lại nữa . Vì các bước làm rất nhiều, save lại sau này open file dxe này sẽ giúp bạn tiết kiệm khá nhiều thời gian khi extract cùng một kiểu dữ liệu nhiều lần.
Hình đã gửi

Hộp thoại Data Extraction Page 2 of 8 xuất hiện, cho phép bạn chọn dữ liệu, bạn có thể chọn dữ liệu trong 1 phần của file, toàn bộ dữ liệu trong file hay nhiều file một lúc. Với trường hợp của bạn, chọn 1 phần của file tức là Select objects in the current drawing. Nhấn Next.
Hình đã gửi

ACAD sẽ cho bạn chọn các đối tượng, với trường hợp của bạn, bạn sẽ chọn các line. Do vậy trong hộp thoại Page 3 of 8 chỉ có duy nhất dữ liệu line.
Hình đã gửi

Trong hộp thoại Page 4 of 8, bạn uncheck tất cả những phần mà bạn không cần đến, rồi nhấn next.
Hình đã gửi

Trong hộp thoại Page 5 of 8, bạn cũng uncheck tất cả những phần mà bạn không cần đến, rồi nhấn next.
Hình đã gửi

Trong hộp thoại Page 6 of 8, bạn hãy chọn kiểu dữ liệu kết xuất. ACAD cho bạn kết xuất đồng thời cả 2 loại là table trong file DWG và kết xuất ra file dữ liệu dạng xls, csv, mdb, txt. Trường hợp của bạn cứ check cả 2 rồi nhấn next.
Hình đã gửi

CAD sẽ ra hộp thoại chọn style của table, bạn cứ để nguyên mà nhấn next.
Thế là xong, bạn đã có phần dữ liệu mà bạn muốn.
Hình đã gửi

Và kết quả bạn có được trong CAD:
Hình đã gửi

ngoài ra, bạn còn có thêm cả file excel nữa:
Hình đã gửi
  • 3

#3 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 17 April 2009 - 07:24 PM

Xin hỏi LỆNH DATAEXTRACTION này có từ version CAD nào, tôi xài cad2005 không có lệnh này.
  • 0

#4 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 17 April 2009 - 08:03 PM

Mình nghĩ yêu cầu của bạn thuong_mdc80 không nhý bạn Nguyen Hoanh nghĩ ðâu. Cái bạn ấy cần không phải là tọa ðộ mà là số hiệu ðiểm và ðộ dài cạnh. Giá sử ta có 2 line trên bản vẽ có ðộ dài là 5 và 10. Nếu 2 line này có một ðiểm chung thì sau khi chạy lisp, ta có file txt nhý sau :
1 2 5.0
2 3 10.0
Còn nếu 2 line trên không có ðểm chung thì file txt sẽ là
1 2 5.0
3 4 10.0
và lúc ðó, trên bản vẽ cũng có text týõng ứng là 1 2 3 hay 1 2 3 4 tại mỗi ðầu mút của line.
Mình nghĩ nhý vậy có ðúng không bạn thuong_mdc80 ?
  • 1

#5 thuong_mdc80

thuong_mdc80

    biết vẽ line

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

Đã gửi 18 April 2009 - 06:04 PM

- ý của mình hoàn toàn đúng với ý của bạn TDVN nói.
  • 0

#6 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 19 April 2009 - 12:46 AM

- ý của mình hoàn toàn ðúng với ý của bạn TDVN nói.

Xin phép bác Nguyen Hoanh cho mình viết cái lisp này giúp bạn 'thuong_mdc80' nhé.
(defun dxf( name n)
(cdr (assoc n (entget name)))
)
(defun opw( tieude duoi)
(setq duongdanfile (getfiled tieude duongdanfile duoi 7))
)
(defun opr( tieude duoi)
(setq duongdanfile (getfiled tieude duongdanfile duoi 6))
)

;ham thong ke so hieu diem va do dai canh
(defun C:DVAC( / ss name i j l p10 p11 d1 d2 s lis n1 f1 n old)
(defun ltp( p)
(list (atof (rtos (car p) 2 2)) (atof (rtos (cadr p) 2 2)) 0)
)
(setq ss (ssget '((0 . "line"))))
(if ss (progn
(setq n1 (opw "Ten file : " "txt"))
(setq f (open n1 "w"))
(setq i 0 lis nil j 1 l (sslength ss))
(while (< i l)
(setq name (ssname ss i))
(setq p10 (dxf name 10) p11 (dxf name 11) s (distance p10 p11))
(if (null lis) (setq d1 1 d2 2 lis (list (list (ltp p10) 1) (list (ltp p11) 2))) (progn
(if (null (setq a (assoc (ltp p10) lis))) (setq lis (append lis (list (list (ltp p10) (+ 1 (length lis))))) d1 (length lis)) (setq d1 (cadr a))
)
(if (null (setq a (assoc (ltp p11) lis))) (setq lis (append lis (list (list (ltp p11) (+ 1 (length lis))))) d2 (length lis)) (setq d2 (cadr a))
)
))
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos s 2 2)) f)
;Nếu bạn muốn có tọa độ thì thay dòng trên bằng dòng này
; (write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos (car p10) 2 2) "\t" (rtos (cadr p10) 2 2) "\t" (rtos (car p11) 2 2) "\t" (rtos (cadr p11) 2 2) "\t" (rtos s 2 2)) f)
;Nếu là tọa độ trắc địa thì như vậy
; (write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos (cadr p10) 2 2) "\t" (rtos (car p10) 2 2) "\t" (rtos (cadr p11) 2 2) "\t" (rtos (car p11) 2 2) "\t" (rtos s 2 2)) f)
(setq i (1+ i))
)
))
(close f)
(setq old (getvar "osmode"))
(setvar "osmode" 0)
(if lis (foreach n lis (command "_.text" (car n) 2.0 0.0 (itoa (cadr n)))))
(setvar "osmode" old)
)
(if (null duongdanfile) (setq duongdanfile ""))
lisp này mặc ðịnh ðộ dài cần 2 số lẽ và ðộ cao text =2. Nếu bạn không thích có thể chỉnh lại
Thýờng thì mình thấy ngýời ta có yêu cầu cả tọa ðộ nhýng bác chỉ cần cạnh. Bác xem thử có ðc 0 nhé
  • 2

#7 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 19 April 2009 - 07:59 AM

Xin phép bác Nguyen Hoanh cho mình viết cái lisp này giúp bạn 'thuong_mdc80' nhé.

(defun dxf( name n)
(cdr (assoc n (entget name)))
)
(defun opw( tieude duoi)
(setq duongdanfile (getfiled tieude duongdanfile duoi 7))
)
(defun opr( tieude duoi)
(setq duongdanfile (getfiled tieude duongdanfile duoi 6))
)

;ham thong ke so hieu diem va do dai canh
(defun C:DVAC( / ss name i j l p10 p11 d1 d2 s lis n1 f1 n old)
(defun ltp( p)
(list (atof (rtos (car p) 2 2)) (atof (rtos (cadr p) 2 2)) 0)
)
(setq ss (ssget '((0 . "line"))))
(if ss (progn
(setq n1 (opw "Ten file : " "txt"))
(setq f (open n1 "w"))
(setq i 0 lis nil j 1 l (sslength ss))
(while (< i l)
(setq name (ssname ss i))
(setq p10 (dxf name 10) p11 (dxf name 11) s (distance p10 p11))
(if (null lis) (setq d1 1 d2 2 lis (list (list (ltp p10) 1) (list (ltp p11) 2))) (progn
(if (null (setq a (assoc (ltp p10) lis))) (setq lis (append lis (list (list (ltp p10) (+ 1 (length lis))))) d1 (length lis)) (setq d1 (cadr a))
)
(if (null (setq a (assoc (ltp p11) lis))) (setq lis (append lis (list (list (ltp p11) (+ 1 (length lis))))) d2 (length lis)) (setq d2 (cadr a))
)
))
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos s 2 2)) f)
(setq i (1+ i))
)
))
(close f)
(setq old (getvar "osmode"))
(setvar "osmode" 0)
(if lis (foreach n lis (command "_.text" (car n) 2.0 0.0 (itoa (cadr n)))))
(setvar "osmode" old)
)
(if (null duongdanfile) (setq duongdanfile ""))
lisp này mặc ðịnh ðộ dài cần 2 số lẽ và ðộ cao text =2. Nếu bạn không thích có thể chỉnh lại
Thýờng thì mình thấy ngýời ta có yêu cầu cả tọa ðộ nhýng bác chỉ cần cạnh. Bác xem thử có ðc 0 nhé

Bạn có thể viết giúp mình thêm thể hiện tọa độ x,y của các điểm đó và xuất ra bảng.
Rất cám ơn
  • 1

#8 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 20 April 2009 - 10:05 AM

Bạn có thể viết giúp mình thêm thể hiện tọa độ x,y của các điểm đó và xuất ra bảng.
Rất cám ơn

Xem trên
  • 0

#9 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 22 April 2009 - 09:19 PM

Xem trên

Không thấy xuất ra bảng tọa độ x,y và chiều dài, mà chỉ có đánh số thứ tự các đỉnh line và chiều dài thôi.
Ý mình muốn nhờ bạn giúp cho lisp tương tự như trên và bổ sung thêm tọa độ x,y của các đỉnh đường.
Như :
STT tọa độ x - tọa độ y - S(m)
S(m) là chiều dài theo stt (n+1 )
tính theo công thức căn bặc hai ( x2-x1)^2 +(y2-y1)^2

Mong được bạn giúp
  • 0

#10 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 22 April 2009 - 10:30 PM

Không thấy xuất ra bảng tọa độ x,y và chiều dài, mà chỉ có đánh số thứ tự các đỉnh line và chiều dài thôi.
Ý mình muốn nhờ bạn giúp cho lisp tương tự như trên và bổ sung thêm tọa độ x,y của các đỉnh đường.
Như :
STT tọa độ x - tọa độ y - S(m)
S(m) là chiều dài theo stt (n+1 )
tính theo công thức căn bặc hai ( x2-x1)^2 +(y2-y1)^2

Mong được bạn giúp

Mình đã sửa cho bạn ở trên rồi nhưng bạn không chịu đọc. Trong lisp dấu ";" là ghi chú. Nếu ở đấu dòng bạn đánh ; thì dòng đó lisp sẽ bỏ qua. Như vậy bản phải chỉnh lại theo yêu cầu của mình.
Bạn thay dòng này
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos s 2 2)) f)
bằng dòng (nếu là tọa độ toán học)
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos (car p10) 2 2) "\t" (rtos (cadr p10) 2 2) "\t" (rtos (car p11) 2 2) "\t" (rtos (cadr p11) 2 2) "\t" (rtos s 2 2)) f)
hoặc dòng (nếu là tọa độ trắc địa)
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos (cadr p10) 2 2) "\t" (rtos (car p10) 2 2) "\t" (rtos (cadr p11) 2 2) "\t" (rtos (car p11) 2 2) "\t" (rtos s 2 2)) f)
  • 0

#11 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 23 April 2009 - 08:45 AM

Mình đã sửa cho bạn ở trên rồi nhưng bạn không chịu đọc. Trong lisp dấu ";" là ghi chú. Nếu ở đấu dòng bạn đánh ; thì dòng đó lisp sẽ bỏ qua. Như vậy bản phải chỉnh lại theo yêu cầu của mình.
Bạn thay dòng này
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos s 2 2)) f)
bằng dòng (nếu là tọa độ toán học)
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos (car p10) 2 2) "\t" (rtos (cadr p10) 2 2) "\t" (rtos (car p11) 2 2) "\t" (rtos (cadr p11) 2 2) "\t" (rtos s 2 2)) f)
hoặc dòng (nếu là tọa độ trắc địa)
(write-line (strcat (itoa d1) "\t" (itoa d2) "\t" (rtos (cadr p10) 2 2) "\t" (rtos (car p10) 2 2) "\t" (rtos (cadr p11) 2 2) "\t" (rtos (car p11) 2 2) "\t" (rtos s 2 2)) f)

Cám ơn bạn đã quan tâm giúp.
mình thay thế theo toạ độ Trắc địa, thử có một line thôi mà sao lisp thống kê lập lại qúa nhiều lần.
Mong được bạn giúp

  • 0

#12 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 23 April 2009 - 09:53 AM

Cám ơn bạn đã quan tâm giúp.
mình thay thế theo toạ độ Trắc địa, thử có một line thôi mà sao lisp thống kê lập lại qúa nhiều lần.
Mong được bạn giúp

Mình đã thử rồi mới post lên. File txt có dạng
"Điểm đầu" "Điểm cuối" "X đầu" "Y đầu" "X cuối" "Y cuối" "Cạnh"
  • 0

#13 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 23 April 2009 - 11:26 AM

Mình đã thử rồi mới post lên. File txt có dạng
"Điểm đầu" "Điểm cuối" "X đầu" "Y đầu" "X cuối" "Y cuối" "Cạnh"

Xin lỗi Bạn , mình đã nhầm trong việc thay thế.
Mình chạy được rồi. Cám ơn nha.
Nhưng khi nhập từ text vào Cad, kết quả mình cảm thấy dài,
Tính nhờ Bạn đơn giản cho các dòng được chứ, như sau :
"Điểm đầu i " "X đầu" "Y đầu" "Cạnh"
(------dòng trống--------------) " cạnh của i+1"
"Điểm kế i+1" "X kế " "Y kế "
..........
Xuất và chèn ra từ Cad luôn , cũng như Lisp lập bảng Hồ sơ kỷ thuật thửa đất của Diễn đàn mình.
Mong được Bạn hiểu và giúp.
  • 0

#14 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 24 April 2009 - 12:51 AM

Xin lỗi Bạn , mình đã nhầm trong việc thay thế.
Mình chạy được rồi. Cám ơn nha.
Nhưng khi nhập từ text vào Cad, kết quả mình cảm thấy dài,
Tính nhờ Bạn đơn giản cho các dòng được chứ, như sau :
"Điểm đầu i " "X đầu" "Y đầu" "Cạnh"
(------dòng trống--------------) " cạnh của i+1"
"Điểm kế i+1" "X kế " "Y kế "
..........
Xuất và chèn ra từ Cad luôn , cũng như Lisp lập bảng Hồ sơ kỷ thuật thửa đất của Diễn đàn mình.
Mong được Bạn hiểu và giúp.

Hình như bạn không nắm rõ điều mình muốn thì phải. Đối với HSKT, các điểm liên tiếp nhau và tạo thành vòng khép kín, có nghĩa là hai điểm liên tiếp nhau (hoặc điểm đầu và điểm cuối) luôn luôn biểu diễn một cạnh. Do đó cái yêu cầu trên của bạn là đúng. Còn trong trường hợp đang xét, các điểm đc sinh ra bất kỳ, 2 điểm liên tiếp chưa chắc biểu diễn một cạnh, nên việc trình bày như bạn nói có thể sẽ sai, chỉ trình bày mỗi cạnh trên một dòng thì mới bảo đảm đúng đc.
  • 1

#15 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 24 April 2009 - 08:12 AM

Hình như bạn không nắm rõ điều mình muốn thì phải. Đối với HSKT, các điểm liên tiếp nhau và tạo thành vòng khép kín, có nghĩa là hai điểm liên tiếp nhau (hoặc điểm đầu và điểm cuối) luôn luôn biểu diễn một cạnh. Do đó cái yêu cầu trên của bạn là đúng. Còn trong trường hợp đang xét, các điểm đc sinh ra bất kỳ, 2 điểm liên tiếp chưa chắc biểu diễn một cạnh, nên việc trình bày như bạn nói có thể sẽ sai, chỉ trình bày mỗi cạnh trên một dòng thì mới bảo đảm đúng đc.

Ờ, việc của mình hiện nay là khác hơn so với HSKT, vì nó là các đường, không tính như vòng kép kín như thửa đất. Chắc việc xuất ra bảng theo thứ tự như HSKT là chưa thể giải quyết hiện nay, Vậy mình phải biên tập bằng tay vậy.
Nhưng sau mình thấy hàng loạt bảng thống kê tọa độ và chiều dài tuyến đường của bản vẽ một số đơn vị đã thực hiện rất ngăn nấp và bài bảng.
Vậy nhờ Bạn giúp thêm : Trong việc xuất số hiệu điểm của các cạnh tên Cad, mình có thể chèn một block vào các điểm đó và có đường mủi tên chỉ ra và ghi số điểm, toạ độ x,y của từng điểm đó.

Mong được bạn giúp
  • 0

#16 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 24 April 2009 - 09:04 AM

Ờ, việc của mình hiện nay là khác hơn so với HSKT, vì nó là các đường, không tính như vòng kép kín như thửa đất. Chắc việc xuất ra bảng theo thứ tự như HSKT là chưa thể giải quyết hiện nay, Vậy mình phải biên tập bằng tay vậy.
Nhưng sau mình thấy hàng loạt bảng thống kê tọa độ và chiều dài tuyến đường của bản vẽ một số đơn vị đã thực hiện rất ngăn nấp và bài bảng.
Vậy nhờ Bạn giúp thêm : Trong việc xuất số hiệu điểm của các cạnh tên Cad, mình có thể chèn một block vào các điểm đó và có đường mủi tên chỉ ra và ghi số điểm, toạ độ x,y của từng điểm đó.

Mong được bạn giúp

Hình như bạn thấy cái lisp này hơi giống với cái công việc của bạn nên bạn nghĩ là áp dụng đc. Vì bạn không post bản vẽ của bạn lên và nói rõ công việc của mình. Theo mình nghĩ cái lisp này không áp dụng cho công việc của bạn đc vì trên tuyến đg tuy không phải là khép kín nhưng số hiệu các điểm là liên tục, còn cách đánh số của lisp này là ngẫu nhiên. Việc lập bảng trên cad cũng là việc đơn giản nhưng mình nghĩ và theo cách trình bày hiện nay của bạn, nó không phù hợp. Nếu bạn muốn có lisp phù hợp hơn, bạn nên post file và nói rõ công việc của bạn, xem thử mình có giúp bạn đc hay không.
  • 0

#17 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 24 April 2009 - 11:39 AM

Hình như bạn thấy cái lisp này hơi giống với cái công việc của bạn nên bạn nghĩ là áp dụng đc. Vì bạn không post bản vẽ của bạn lên và nói rõ công việc của mình. Theo mình nghĩ cái lisp này không áp dụng cho công việc của bạn đc vì trên tuyến đg tuy không phải là khép kín nhưng số hiệu các điểm là liên tục, còn cách đánh số của lisp này là ngẫu nhiên. Việc lập bảng trên cad cũng là việc đơn giản nhưng mình nghĩ và theo cách trình bày hiện nay của bạn, nó không phù hợp. Nếu bạn muốn có lisp phù hợp hơn, bạn nên post file và nói rõ công việc của bạn, xem thử mình có giúp bạn đc hay không.

File mẫu và ghi chú yêu cầu trên file
http://www.cadviet.c..._Giao_thong.rar
  • 0

#18 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 26 April 2009 - 02:08 AM

File mẫu và ghi chú yêu cầu trên file
http://www.cadviet.c..._Giao_thong.rar

Mình cung cấp cho bạn file block để vẽ mốc http://www.cadviet.c...iles/MOCTIM.dwg
và lisp http://www.cadviet.c...aosat2009_1.lsp
để bạn dùng. Việc vẽ cái vòng tròn và hai cái text trên duoi hôm nào rãnh mình làm tiếp.
Tuy nhiên, để mình hỏi thêm các bác trong diễn đàn xem có thể tạo cái block mà có thể kéo qua lại một nhóm đối tượng và có cái "dây" di chuyển theo hay không, tạm gọi là block động
http://www.cadviet.c.../block_dong.bmp
  • 2

#19 khaosat2009

khaosat2009

    biết lệnh offset

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

Đã gửi 26 April 2009 - 07:34 AM

Mình cung cấp cho bạn file block để vẽ mốc http://www.cadviet.c...iles/MOCTIM.dwg
và lisp http://www.cadviet.c...aosat2009_1.lsp
để bạn dùng. Việc vẽ cái vòng tròn và hai cái text trên duoi hôm nào rãnh mình làm tiếp.
Tuy nhiên, để mình hỏi thêm các bác trong diễn đàn xem có thể tạo cái block mà có thể kéo qua lại một nhóm đối tượng và có cái "dây" di chuyển theo hay không, tạm gọi là block động
http://www.cadviet.c.../block_dong.bmp

Cám ơn Bạn tdvn nha,
Rất nể phục bạn, không ngờ trong một thời gian chỉ vài tiếng đồng hồ mà Bạn đã cho ra một sản phẩm rất hữu ích.
... và tâm trạng hiện nay mình đang hồi hộp chờ phần hoàn thiện của Bạn.
Chúc Bạn sức khoẻ - hạnh phúc và thành đạt

  • 0

#20 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 29 April 2009 - 12:40 AM

mình đang chờ phần hoàn thiện của Bạn.

Bạn thấy đấy. Vì muốn tạo một cái block như ý của bạn mà mình phải nhờ tới "cộng đồng" cadviet mới làm ra đc đấy chứ không phải đơn giản đâu. Có thể bạn cũng đã đọc thấy rồi. Vì thời gian có hạn nên mình cũng không nghiên cứu sâu về cái "block động" ngay đc, tạm sử dụng cái block của bạn "abcd" rồi chỉnh lại chút ít. Nếu bạn muốn có cái block như ý mình thì hãy nghiên cứu thêm để dùng nhé.
Mình post cho bạn cái file mình đã chỉnh lại để lisp sử dụnh để insert vào bản vẽ (nó chỉ "động" trên cad đời cao hơn 2004 - mình chạy trên cad2008): http://www.cadviet.c...s/TRUTIM_R8.dwg
Còn trong code lisp bạn thay thế như vậy :
;thay dòng
(command "_.insert" "MOCTIM" "s" k p 0.0 so)
;thành dòng
(command "_.insert" "TRUTIM-R8" "s" (/ k 100.0) p 0.0 so "CDTK" "CDTC")
code đầy đủ :
;Lenh tao moc tim duong
(defun C:MOCTIM( / p so old k tyle1 lold)
(setq lold (getvar "clayer"))
(setq old (getvar "osmode"))
(setvar "osmode" 9)
(setq tylein 500)
(setq tyle1 (getint (strcat "\nTy le in ban do <" (itoa tylein ) ">: ")))
(if tyle1 (setq tylein tyle1))
(setq k (/ tylein 1000.0))
(setq so "1")
(command "_.layer" "m" "MOCTIM" "c" 2 "" "")
(setvar "clayer" "Moctim")
(INITGET 128)
(WHILE (SETQ P (GETPOINT (strcat "\nNhap so hieu diem <" so "> hoac Pick ")))
(cond
((listp p)
; (command "_.insert" "MOCTIM" "s" k p 0.0 so)
(command "_.insert" "TRUTIM-R8" "s" (/ k 100.0) p 0.0 so "CDTK" "CDTC");dong moi
(setq so (itoa (1+ (atoi so))))
)
((= (type p) 'STR) (setq so p))
)
(INITGET 128)
)
(setvar "osmode" old)
(setvar "clayer" lold)
(PRINC)
)


(defun bangtdmoc( lis / tyle1 p lis)
(if (null tylein) (progn
(setq tylein 500)
(setq tyle1 (getint (strcat "\nTy le in <" (itoa tylein) ">: ")))
(if tyle1 (setq tylein tyle1))
))
(if (setq p (getpoint "\nVi tri dat bang toa do")) (bangtdmoc1 lis tylein p) (PRINT "ban chua chon vi tri dat bang"))
)

(defun bangtdmoc2( lis2 lis3 p s h / p1 p2 p3 p4 s1 s2 s3 s4 st x1 y1 x2 y2 canh)
(print lis2)
(print lis3)
(setq st (nth 0 lis2))
(setq y1 (nth 1 lis2))
(setq x1 (nth 2 lis2))
(setq s1 (/ s 13.0) s2 (* 5.25 s1) s3 (* 9.25 s1) s4 (* 12.25 s1))
(setq p1 (list (+ (car p) s1) (cadr p) 0.0) p2 (list (+ (car p) s2) (cadr p) 0.0) p3 (list (+ (car p) s3) (cadr p) 0.0) p4 (list (+ (car p) s4) (- (cadr p) h) 0.0))
(command "_.text" "j" "c" p1 h 0.0 st)
(command "_.text" "j" "r" p2 h 0.0 (rtos x1 2 3))
(command "_.text" "j" "r" p3 h 0.0 (rtos y1 2 3))
(if lis3 (progn
(setq y2 (nth 1 lis3))
(setq x2 (nth 2 lis3))
(setq canh (distance (list x1 y1 0.0) (list x2 y2 0.0)))
(if (> canh 0.0) (command "_.text" "j" "r" p4 h 0.0 (rtos canh 2 3)))
))
)

(defun bangtdmoc1( lis tylein p / h s1 s2 s3 i j k lis1 lis2 p1 hetd khn khd nl1 nl2)
(setq nl1 (entlast))
(setq h (* 2.0 (/ (float tylein) 1000.0)))
(setq khn (* 71.5 (/ (float tylein) 1000.0)))
(setq k 1)
(setq p1 (list (+ (car p) (/ khn 2.0)) (- (cadr p) (* 4.0 k h)) 0.0))
(command "_.text" "s" "vhelvcb" "j" "c" p1 (* 1.25 h) 0.0 "BAÛNG THOÁNG KEÂ TOÏA ÑOÄ")
(command "_.line" (list (car p) (- (cadr p) (* 5 h)) 0.0) (list (+ (car p) khn) (- (cadr p) (* 5 h)) 0.0) "")
(setq p1 (list (car p) (- (cadr p) (* 7 h)) 0.0))
(command "_.text" "s" "vhelvcn" p1 (* 1.0 h) 0.0 " Moác X(m) Y(m) Caïnh")
(command "_.line" (list (car p) (- (cadr p) (* 8 h)) 0.0) (list (+ (car p) khn) (- (cadr p) (* 8 h)) 0.0) "")
(setq i 0 k 5)
(while (< i (length lis))
(setq lis1 (nth i lis))
(setq j 0)
(while (<= j (- (length lis1) 1))
(if (< j (length lis1)) (setq lis2 (nth j lis1)) (setq lis2 (nth 0 lis1)))
(if (< (+ j 1) (length lis1)) (setq lis3 (nth (+ j 1) lis1)) (setq lis3 nil))
(setq p1 (list (car p) (- (cadr p) (* 2 k h)) 0.0))
(bangtdmoc2 lis2 lis3 p1 khn h)
(setq j (1+ j))
(setq k (1+ k))
)
(command "_.line" (list (car p) (- (cadr p) (* 2 K h)) 0.0) (list (+ (car p) khn) (- (cadr p) (* 2 K h)) 0.0) "")
(setq k (1+ k))
(setq i (1+ i))
)
(setq k (1- k))
(command "_.line" (list (car p) (- (cadr p) (* 5 h)) 0.0) (list (car p) (- (cadr p) (* 2 K h)) 0.0) "")
(command "_.line" (list (+ (car p) (/ KHN 6.5)) (- (cadr p) (* 5 h)) 0.0) (list (+ (car p) (/ KHN 6.5)) (- (cadr p) (* 2 K h)) 0.0) "")
(command "_.line" (list (+ (car p) (* (/ KHN 6.5) 3.0)) (- (cadr p) (* 5 h)) 0.0) (list (+ (car p) (* (/ KHN 6.5) 3.0)) (- (cadr p) (* 2 K h)) 0.0) "")
(command "_.line" (list (+ (car p) (* (/ KHN 6.5) 5.0)) (- (cadr p) (* 5 h)) 0.0) (list (+ (car p) (* (/ KHN 6.5) 5.0)) (- (cadr p) (* 2 K h)) 0.0) "")
(command "_.line" (list (+ (car p) KHN) (- (cadr p) (* 5 h)) 0.0) (list (+ (car p) KHN) (- (cadr p) (* 2 K h)) 0.0) "")
)



;Lenh tao bang toa do
(defun C:BANGTDMT( / i list1 ss n listXY old kt n1 ent st p )
(setq old (getvar "osmode"))
(setq listXY nil)
(setq i 1 kt T n nil)
(setq list1 nil)
(prompt (strcat "\nChon nhom doi tuong moc ranh thu " (itoa i)))
(while kt
(while (setq n (entsel "\nChon moc"))
(setq n (car n))
(setq n1 (entnext n))
(setq ent (entget n1))
(setq st (cdr (assoc 1 ent)))
(setq p (cdr (assoc 10 (entget n))))
(setq list1 (append list1 (list (cons st p))))
)
(if list1 (setq listXY (append listXY (list list1))))
(setq i (1+ i))
(if (null (setq n (entsel (strcat "\nChon nhom doi tuong moc thu " (itoa i))))) (setq kt nil) (progn
(setq list1 nil)
(setq n (car n))
(setq n1 (entnext n))
(setq ent (entget n1))
(setq st (cdr (assoc 1 ent)))
(setq p (cdr (assoc 10 (entget n))))
(setq list1 (append list1 (list (cons st p))))
))
)
(setvar "osmode" 0)
(if listXY (progn
(if (null (tblsearch "style" "vhelvcn")) (command "_.style" "vhelvcn" "vhelvcn.ttf" "" "" "" "" ""))
(if (null (tblsearch "style" "vhelvcb")) (command "_.style" "vhelvcb" "vhelvcb.ttf" "" "" "" "" ""))
(command "_.layer" "m" "Bangtdgr" "")
(setvar "clayer" "Bangtdgr")
(bangtdmoc listXY)
))
(setvar "osmode" old)
(princ)
)

  • 3