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.
Đăng nhập để thực hiện theo  
BKXD98

Cách xác định kích thước thật của dimension ?

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

BKXD98    0

Hiện nay, tôi đang viết 1 tiện ích sắp xếp lại các dimension của line, cách hoạt động như sau :

1/ Chọn các dimension cần sắp xếp theo 1 phương lần 1 (dimension có thể là aligndimension hay rotateddimension), nó sẽ tự kiểm tra xem các đối tượng này có cùng loại dimension và cùng phương hay không (có thể theo phương bất kỳ)

2/ Chọn các dimension cần sắp xếp theo 1 phương lần 2 --> kiểm tra như lần 1

 

Tiện ích này sẽ tự sắp xếp các dimension được chọn ở lần 1 theo cùng 1 phương (xem bản vẽ đính kèm), sau đó sẽ sắp xếp các dimension được chọn ở lần 2 theo cùng 1 phương cách các dimension lần 1 1 khoảng cố định.

 

Khi viết đến đoạn canh các đường dóng của dimension chọn lần 1 thì tôi gặp phải 1 vấn đề sau : Làm sao lấy được kích thước thật của dimension (khoảng cách thật trên bản vẽ chứ không phải là kích thước sau khi đã nhân với tỷ lệ của dimstyle) (mã dxf của kích thước sau khi nhân với tỷ lệ của dimstyle là 42)

 

BV va file lisp

 

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
ssg    1.088
Hiện nay, tôi đang viết 1 tiện ích sắp xếp lại các dimension của line, cách hoạt động như sau :

1/ Chọn các dimension cần sắp xếp theo 1 phương lần 1 (dimension có thể là aligndimension hay rotateddimension), nó sẽ tự kiểm tra xem các đối tượng này có cùng loại dimension và cùng phương hay không (có thể theo phương bất kỳ)

2/ Chọn các dimension cần sắp xếp theo 1 phương lần 2 --> kiểm tra như lần 1

 

Tiện ích này sẽ tự sắp xếp các dimension được chọn ở lần 1 theo cùng 1 phương (xem bản vẽ đính kèm), sau đó sẽ sắp xếp các dimension được chọn ở lần 2 theo cùng 1 phương cách các dimension lần 1 1 khoảng cố định.

 

Khi viết đến đoạn canh các đường dóng của dimension chọn lần 1 thì tôi gặp phải 1 vấn đề sau : Làm sao lấy được kích thước thật của dimension (khoảng cách thật trên bản vẽ chứ không phải là kích thước sau khi đã nhân với tỷ lệ của dimstyle) (mã dxf của kích thước sau khi nhân với tỷ lệ của dimstyle là 42)

 

BV va file lisp

 

Xin cảm ơn.

Bạn dùng DXF 13 và 14, đây là 2 điểm chuẩn với kích thước thật của dimension. Khoảng cách giữa 2 điểm này là cái bạn cầ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
BKXD98    0
Bạn dùng DXF 13 và 14, đây là 2 điểm chuẩn với kích thước thật của dimension. Khoảng cách giữa 2 điểm này là cái bạn cần.

 

không chính xác vì đối với rotateddimension thì nếu đoạn nối 2 điểm 13 và 14 không song song với dimension thì khoảng cách của nó không đúng như mình cần.

 

Tối hôm qua về nghĩ mãi về nó, cuối cùng cũng tìm ra 1 cách là dùng toán học, khoảng cách thật bằng khoảng cách giữa 2 điểm 13 và 14 nhân với cos của góc tạo bởi điểm 13 và 14 (dùng function angle) trừ đi góc của dimension (mã dxf là 50).

 

Bây giờ thì tôi cần biết chiều cao của text trong dimension và tổng quát hơn là cách lấy được CSDL của tất cả các đối tượng trong dimension.

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
ssg    1.088
không chính xác vì đối với rotateddimension thì nếu đoạn nối 2 điểm 13 và 14 không song song với dimension thì khoảng cách của nó không đúng như mình cần.

 

Tối hôm qua về nghĩ mãi về nó, cuối cùng cũng tìm ra 1 cách là dùng toán học, khoảng cách thật bằng khoảng cách giữa 2 điểm 13 và 14 nhân với cos của góc tạo bởi điểm 13 và 14 (dùng function angle) trừ đi góc của dimension (mã dxf là 50).

 

Bây giờ thì tôi cần biết chiều cao của text trong dimension và tổng quát hơn là cách lấy được CSDL của tất cả các đối tượng trong dimension.

Thanks.

1- Dùng cos của góc có một vấn đề bất ổn. Bạn phải phân tích đủ các trường hợp khác nhau (dim thẳng đứng, nằm ngang, với chân dim thì đoạn nào dài, đoạn nào ngắn...) mới có thể xác định chính xác được góc để lấy cos. Thêm nữa, việc phân biệt được góc vị trí (giữa 1 line nối 2 điểm với chuẩn 0 quy ước) là 0 độ hay 360 độ (hoặc 359 hay -1 độ...) là một vấn đề khá đau đầu. Bất đắc dĩ mình mới dùng kiểu này.

Mình có một hướng khác: bạn lấy DXF 50 sẽ biết là dim nằm ngang hay thẳng đứng. Từ đó sẽ xác định được là cần hoành hoặc tung độ của các điểm 13 và 14 để tính toán.

2- Hàm entget không lấy được textheigh trong dimension. Bạn dùng (tblsearch "dimstyle" ) sẽ lấy được. Nếu chưa đúng ý thì bạn nêu rõ, mình sẽ tìm cách khác (có một cách hơi... "củ chuối" nhưng chắc chắn sẽ lấy được toàn bộ properties của text trong 1 dim bất kỳ, kể cả user có edit nó kiểu gì đi 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
BKXD98    0
1- Dùng cos của góc có một vấn đề bất ổn. Bạn phải phân tích đủ các trường hợp khác nhau (dim thẳng đứng, nằm ngang, với chân dim thì đoạn nào dài, đoạn nào ngắn...) mới có thể xác định chính xác được góc để lấy cos. Thêm nữa, việc phân biệt được góc vị trí (giữa 1 line nối 2 điểm với chuẩn 0 quy ước) là 0 độ hay 360 độ (hoặc 359 hay -1 độ...) là một vấn đề khá đau đầu. Bất đắc dĩ mình mới dùng kiểu này.

Mình có một hướng khác: bạn lấy DXF 50 sẽ biết là dim nằm ngang hay thẳng đứng. Từ đó sẽ xác định được là cần hoành hoặc tung độ của các điểm 13 và 14 để tính toán.

2- Hàm entget không lấy được textheigh trong dimension. Bạn dùng (tblsearch "dimstyle" <tên dimstyle>) sẽ lấy được. Nếu chưa đúng ý thì bạn nêu rõ, mình sẽ tìm cách khác (có một cách hơi... "củ chuối" nhưng chắc chắn sẽ lấy được toàn bộ properties của text trong 1 dim bất kỳ, kể cả user có edit nó kiểu gì đi nữa)

 

1/ Bạn xem lại, cách dùng cos ... là đúng với mọi trường hợp, mục đích của tôi là đúng với dimension có phương bất kỳ, sai sót nếu có là dấu âm (khắc phục bằng hàm abs). Cách này cũng là bất khả kháng do tôi không biết cách lấy 1 tỷ lệ của dimension (nếu lấy được thì khoảng cách thật = kc theo dxf 42 chia cho tỷ lệ của dim).

2/ Nếu text trong dimension không theo height của textstyle thì không đúng.

 

Quan điểm của tôi là tìm ra cách giải quyết vấn đề trước đã, bác vui lòng cho tôi biết cách "củ chuối" đó. :lol:

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
ssg    1.088
1/ Bạn xem lại, cách dùng cos ... là đúng với mọi trường hợp, mục đích của tôi là đúng với dimension có phương bất kỳ, sai sót nếu có là dấu âm (khắc phục bằng hàm abs). Cách này cũng là bất khả kháng do tôi không biết cách lấy 1 tỷ lệ của dimension (nếu lấy được thì khoảng cách thật = kc theo dxf 42 chia cho tỷ lệ của dim).

2/ Nếu text trong dimension không theo height của textstyle thì không đúng.

 

Quan điểm của tôi là tìm ra cách giải quyết vấn đề trước đã, bác vui lòng cho tôi biết cách "củ chuối" đó. :lol:

Thanks.

Cái "củ chuối" ấy đây! Có thể thay DXF 43 bằng bất cứ cái gì bạn muốn...

 

(defun DimVal(d / val)
(command "explode" d)
(setq Val (cdr (assoc 43 (entget (entlast)))))
(command "undo" 1)
Val
)
;;;---------------------------
(defun C:VD()
(alert (strcat "Text height = " (rtos (DimVal (car (entsel "\nSelect dimension:"))))))
)

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
BKXD98    0
Cái "củ chuối" ấy đây! Có thể thay DXF 43 bằng bất cứ cái gì bạn muốn...

 

(defun DimVal(d / val)
(command "explode" d)
(setq Val (cdr (assoc 43 (entget (entlast)))))
(command "undo" 1)
Val
)
;;;---------------------------
(defun C:VD()
(alert (strcat "Text height = " (rtos (DimVal (car (entsel "\nSelect dimension:"))))))
)

 

đúng là củ chuối thật :lol:

Thanks, anyway.

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
ssg    1.088
... Cách này cũng là bất khả kháng do tôi không biết cách lấy 1 tỷ lệ của dimension (nếu lấy được thì khoảng cách thật = kc theo dxf 42 chia cho tỷ lệ của dim).

 

Bạn thử với đoạn này, chắc là không "chuối" nữa!

 

(defun C:DLF( / d d1 k);;;get DIMLFAC of dimension entity
(setq  d (entget (car (entsel "\nSelect dimension:")) '("ACAD")))
(if (setq d1 (cdr (car (cdr (assoc -3 d)))))
(setq k (cdr (assoc 1040 d1)))
(setq k (cdr (assoc 144 (tblsearch "dimstyle" (cdr (assoc 3 d))))))
)
(alert (strcat "DimLFAC = " (rtos k)))
)

  • Vote tăng 3

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
MANHHUNGXDA    458
Hiện nay, tôi đang viết 1 tiện ích sắp xếp lại các dimension của line, cách hoạt động như sau :

1/ Chọn các dimension cần sắp xếp theo 1 phương lần 1 (dimension có thể là aligndimension hay rotateddimension), nó sẽ tự kiểm tra xem các đối tượng này có cùng loại dimension và cùng phương hay không (có thể theo phương bất kỳ)

2/ Chọn các dimension cần sắp xếp theo 1 phương lần 2 --> kiểm tra như lần 1

 

Tiện ích này sẽ tự sắp xếp các dimension được chọn ở lần 1 theo cùng 1 phương (xem bản vẽ đính kèm), sau đó sẽ sắp xếp các dimension được chọn ở lần 2 theo cùng 1 phương cách các dimension lần 1 1 khoảng cố định.

 

Khi viết đến đoạn canh các đường dóng của dimension chọn lần 1 thì tôi gặp phải 1 vấn đề sau : Làm sao lấy được kích thước thật của dimension (khoảng cách thật trên bản vẽ chứ không phải là kích thước sau khi đã nhân với tỷ lệ của dimstyle) (mã dxf của kích thước sau khi nhân với tỷ lệ của dimstyle là 42)

 

BV va file lisp

 

Xin cảm ơn.

Tôi không nhầm thì cái lisp bạn cần ở đâu đó của diễn đàn, bạn thư tìm xem, nó còn tiện dụng hơn ý tưởng của bạn, đó là chọn 1 phát hết tất cả các dim, sau đó nó lọc ra theo từng hàng và thứ tự luô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
BKXD98    0
Bạn thử với đoạn này, chắc là không "chuối" nữa!

 

(defun C:DLF( / d d1 k);;;get DIMLFAC of dimension entity
(setq  d (entget (car (entsel "\nSelect dimension:")) '("ACAD")))
(if (setq d1 (cdr (car (cdr (assoc -3 d)))))
(setq k (cdr (assoc 1040 d1)))
(setq k (cdr (assoc 144 (tblsearch "dimstyle" (cdr (assoc 3 d))))))
)
(alert (strcat "DimLFAC = " (rtos k)))
)

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
gia_bach    1.442
................

Bây giờ thì tôi cần biết chiều cao của text trong dimension và tổng quát hơn là cách lấy được CSDL của tất cả các đối tượng trong dimension.

Thanks.

 

Hàm (vlax-dump-object obj [T]) để view tất cả CSDL của 1 đối tượng

 

Hàm (vlax-get-property object property) để lấy 1 thuộc tính của đối tượng.

 

 

 

;;;View tat ca CSDL
(defun C:HaveaDump (/)
 (vl-load-com)
 (setq ent (entsel "\nSelect object:"))
 (vlax-dump-object (vlax-Ename->Vla-Object (car ent)))
 (princ)
)				

;;;chieu cao Text Kich thuoc
(defun C:TextDimHeight (/ ent eObj)
 (setq	ent	   (entsel "\nSelect dimension:")
eObj	   (vlax-ename->vla-object (car ent))
TextHeight (* (vla-get-TextHeight eObj)
	      (vla-get-ScaleFactor eObj)
	   )
 )
 TextHeight
)
;;;Kich thuoc that cua Dimension
(defun C:KCDim (/ ent eObj)
 (setq	ent   (entsel "\nSelect dimension:")
eObj  (vlax-ename->vla-object (car ent))
kcach (/ (vla-get-Measurement eObj)
	 (vla-get-LinearScaleFactor eObj)
      )
 )
 kcach
)

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
BKXD98    0

Thanks bác gia_bach.

Những hàm bắt đầu vlax-... có phải là The VLISP ActiveX functions ko? Muốn dùng nó đầu tiên phải load nó bằng dòng lệnh (vl-load-com) ? Nếu có thể, bác gia_bach vui lòng giới thiệu vài dòng về những hàm nà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
ssg    1.088
Thanks bác gia_bach.

Những hàm bắt đầu vlax-... có phải là The VLISP ActiveX functions ko? Muốn dùng nó đầu tiên phải load nó bằng dòng lệnh (vl-load-com) ? Nếu có thể, bác gia_bach vui lòng giới thiệu vài dòng về những hàm này ...

Vào Help đọc đi bạn:

 

VLISP adds a set of functions to the AutoLISP language that provides access to ActiveX objects. The function names are prefixed with vla-: for example, vla-addCircle, vla-get-ModelSpace, vla-getColor...

 

VLISP also adds a set of ActiveX-related functions whose names are prefixed with vlax-. These are more general ActiveX functions, each of which can be applied to numerous methods, objects, or properties. For example, with the vlax-get-property function, you can obtain any property of any ActiveX object...

 

If your drawing contains custom ActiveX objects, or if you need to access objects from other applications, such as a Microsoft Excel spreadsheet, you can use the vlax-invoke-method, vlax-get-property, and vlax-put-property functions to access their methods and properties...

 

Về tổng quan, đọc là hiểu ngay, vấn đề là áp dụng chúng... Nếu "vui lòng", bạn gia_bach có thể chia sẻ với anh em vài kinh nghiệm?

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
gia_bach    1.442
Thanks bác gia_bach.

Những hàm bắt đầu vlax-... có phải là The VLISP ActiveX functions ko? Muốn dùng nó đầu tiên phải load nó bằng dòng lệnh (vl-load-com) ? Nếu có thể, bác gia_bach vui lòng giới thiệu vài dòng về những hàm này ...

 

Đối với AutoCAD phiên bản trước 2004, trước khi sử dụng các hàm vlax- cần phải khởi động ActiveX bằng dòng lệnh (vl-load-com) , tuy nhiên CAD 2004 do ActiveX được mặc định nạp khi khởi động AutoCad nên dòng lệnh (vl-load-com) là không cần thiết nhưng cứ thêm vào cho chắc (dư thì không sao, nếu thiếu thì Cad báo lỗi).

 

 

Hàm vlax-get-property hay đơn giản hơn là vlax-get để truy xuất CSDL của đối tượng(VLA-object), tương tự như cách chúng ta truy xuất qua các code DXF với Lisp.

 

Kết quả của lệnh HaveaDump với đốii tượng là TEXT :

Command: HaveaDump

Select object:

; IAcadText: AutoCAD Text Interface

; Property values:

; Alignment = 0

; Application (RO) = #<VLA-OBJECT IAcadApplication 00b5e51c>

; Backward = 0

; Document (RO) = #<VLA-OBJECT IAcadDocument 01268360>

; Handle (RO) = "9B"

; HasExtensionDictionary (RO) = 0

; Height = 175

; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 06461014>

; InsertionPoint = (5.96983 16.4748 0.0)

; Layer = "D-STR"

; Linetype = "ByLayer"

; LinetypeScale = 1.0

; Lineweight = -1

; Normal = (0.0 0.0 1.0)

; ObjectID (RO) = 2130005784

; ObjectName (RO) = "AcDbText"

; ObliqueAngle = 0.0

; OwnerID (RO) = 2130005240

; PlotStyleName = "ByLayer"

; Rotation = 0.0

; ScaleFactor = 1.0

; StyleName = "Standard"

; TextAlignmentPoint = (0.0 0.0 0.0)

; TextGenerationFlag = 0

; TextString = "CadViet.com"

; Thickness = 0.0

; TrueColor = #<VLA-OBJECT IAcadAcCmColor 06462a30>

; UpsideDown = 0

; Visible = -1

 

các dòng màu đỏ cho ta biết :

Height : chiều cao = 175

Layer : lớp = D-STR

TextString : nội dung = CadViet.com

 

để truy xuất các giá trị này, ta chỉ việc thêm chúng vào sau hàm vlax-get- :

(setq chcao (vla-get-Height eObj) ) ; chiều cao text

(setq lop (vla-get-Layer eObj) ) ; lớp

(setq str (vla-get-TextString eObj) ); noi dung

 

Ví dụ truy xuất đối tượng TETX

(defun C:ex_vla	(/ ent eObj chcao lop str)
 (vl-load-com)
 (setq	ent  (entsel)
eObj (vlax-Ename->Vla-Object (car ent))
 )
 (if (= (vla-get-ObjectName eObj) "AcDbText")
   (progn
     (setq chcao (vla-get-Height eObj)	; chie^`u cao text
    lop	  (vla-get-Layer eObj)	; lo+'p
    str	  (vla-get-TextString eObj) ; noi dung
     )
     (alert (strcat "chieu cao text : " (rtos chcao)))
     (alert (strcat "lop text : " lop))
     (alert (strcat "noi dung text : " str))
   )
   (alert (strcat "Ban da chon doi tuong : "
	   (vla-get-ObjectName eObj)
   )
   )
 )
)

 

Hy vọng vài dòng trên giúp bạn cách truy xuất CSDL qua ActiveX.

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

Đăng nhập để thực hiện theo  

×