Rated 5/5 based on 240179 internet user reviews

Jump to content


Change Photo
- - - - -

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


  • Please log in to reply
13 replies to this topic

#1 BKXD98

BKXD98

    biết vẽ circle

  • Members
  • PipPip
  • 32 posts
Danh tiếng: 0 (b́nh thường)

Gửi vào 05 September 2008 - 05:20 PM

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.
  • 0

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1,228 posts
Danh tiếng: 1056 (rất tốt)

Gửi vào 06 September 2008 - 07:26 AM

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.
  • 0

#3 BKXD98

BKXD98

    biết vẽ circle

  • Members
  • PipPip
  • 32 posts
Danh tiếng: 0 (b́nh thường)

Gửi vào 06 September 2008 - 08:19 AM

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ư ḿ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.
  • 0

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1,228 posts
Danh tiếng: 1056 (rất tốt)

Gửi vào 06 September 2008 - 09:33 AM

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ư ḿ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ĩ ḿnh mới dùng kiểu này.
Ḿ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ơ, ḿ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 ǵ đi nữa)
  • 0

#5 BKXD98

BKXD98

    biết vẽ circle

  • Members
  • PipPip
  • 32 posts
Danh tiếng: 0 (b́nh thường)

Gửi vào 06 September 2008 - 10:23 AM

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ĩ ḿnh mới dùng kiểu này.
Ḿ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ơ, ḿ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 ǵ đ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 ḷng cho tôi biết cách "củ chuối" đó. :lol:
Thanks.
  • 0

#6 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1,228 posts
Danh tiếng: 1056 (rất tốt)

Gửi vào 06 September 2008 - 10:41 AM

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 ḷ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 ǵ 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:"))))))
)

  • 0

#7 BKXD98

BKXD98

    biết vẽ circle

  • Members
  • PipPip
  • 32 posts
Danh tiếng: 0 (b́nh thường)

Gửi vào 06 September 2008 - 11:43 AM

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

#8 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1,228 posts
Danh tiếng: 1056 (rất tốt)

Gửi vào 06 September 2008 - 01:57 PM

... 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)))
)

  • 3

#9 MANHHUNGXDA

MANHHUNGXDA

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 926 posts
Danh tiếng: 455 (tốt)

Gửi vào 06 September 2008 - 02:27 PM

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!
  • 0
Hăy ước cho trọn 1 ước mơ!

#10 BKXD98

BKXD98

    biết vẽ circle

  • Members
  • PipPip
  • 32 posts
Danh tiếng: 0 (b́nh thường)

Gửi vào 07 September 2008 - 10:11 PM

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.
  • 0

#11 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1,189 posts
Danh tiếng: 1280 (rất tốt)

Gửi vào 08 September 2008 - 01:47 PM

................
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)

  • 0

#12 BKXD98

BKXD98

    biết vẽ circle

  • Members
  • PipPip
  • 32 posts
Danh tiếng: 0 (b́nh thường)

Gửi vào 08 September 2008 - 11:06 PM

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 ḍng lệnh (vl-load-com) ? Nếu có thể, bác gia_bach vui ḷng giới thiệu vài ḍng về những hàm này ...
  • 0

#13 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1,228 posts
Danh tiếng: 1056 (rất tốt)

Gửi vào 09 September 2008 - 07:22 AM

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 ḍng lệnh (vl-load-com) ? Nếu có thể, bác gia_bach vui ḷng giới thiệu vài ḍ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 ḷng", bạn gia_bach có thể chia sẻ với anh em vài kinh nghiệm?
Thanks
  • 0

#14 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1,189 posts
Danh tiếng: 1280 (rất tốt)

Gửi vào 09 September 2008 - 09:57 AM

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 ḍng lệnh (vl-load-com) ? Nếu có thể, bác gia_bach vui ḷng giới thiệu vài ḍ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 ḍ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 ḍ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 ḍ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 ḍng trên giúp bạn cách truy xuất CSDL qua ActiveX.
  • 0