Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

hochoaivandot xin hỏi về cách lấy units của 1 bản vẽ đang đóng.

Em đang ở bản vẽ hiện hành.

Em có đường dẫn 1 bản vẽ "C:Drawing1"

Bản vẽ này đang đóng (tức là không đang open)

Mọi người chỉ giúp 1 đoạn lisp lấy units của bản vẽ này.

Nếu làm thủ công thì phải mở bản vẽ lên, lấy biến INSINITS.

Copy rồi qua bản vẽ hiện thời Paste vào. Sau cùng phải đóng bản vẽ kia lại.

 

Cái này em giải quyết vấn đề Insert block từ đường dẫn (C:Drawing1) nhưng units trong (C:Drawing1) và units trong bản vẽ hiện hành không giống nhau thì tỷ lệ Insert không như ý được

Mong mọi người cho hướng giải quyết!

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

E tưởng bác đã biết bản vẽ bác tạo Block có cái sysvar kia bằng bao nhiêu rồi chứ ^^ Không thì bật 1 lần lên là bít rùi mà. Rồi lưu vào registry, env, file, userr, thậm chí gán luôn vào Xdata của Block .... Những lần sau ta đọc lại thôi ^^

Nếu không thì đành dùng DBx

  • 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

E tưởng bác đã biết bản vẽ bác tạo Block có cái sysvar kia bằng bao nhiêu rồi chứ ^^ Không thì bật 1 lần lên là bít rùi mà. Rồi lưu vào registry, env, file, userr, thậm chí gán luôn vào Xdata của Block .... Những lần sau ta đọc lại thôi ^^

Nếu không thì đành dùng DBx

ketxu có thể nói rõ hơn về cái gán luôn vào Xdata của Block không?

Mình mới nghe lần đầu thấy tò mò quá.

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ái gán Xdata e chưa test, vì chưa rõ phương thức WBlock thì còn lưu trữ Xdata được 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

Cái gán Xdata e chưa test, vì chưa rõ phương thức WBlock thì còn lưu trữ Xdata được không ^^

 

cần phân biệt Block Table của 1 Block (lưu trong data bản vẽ)Instance của Block Table (hiện trên bản vẽ).

có thể gán XData cho instance của Block Table nhưng ko thể gán Xdata cho Block Table dc.

Khi insert Block từ bản vẽ này sang bản vẽ khác thực chất là copy Block Table.

Có sai sót gì mọi ng góp ý thêm nha. Thân!

 

@Hochoai: nếu insert Block do mình tạo ra thì mình đã biết unit rồi, nếu insert từ Block bất kì thì cứ insert vào rồi kiểm tra unit -> scale vậ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

cần phân biệt Block Table của 1 Block (lưu trong data bản vẽ)Instance của Block Table (hiện trên bản vẽ).

 

Khi insert Block từ bản vẽ này sang bản vẽ khác thực chất là copy Block Table.

Có sai sót gì mọi ng góp ý thêm nha. Thân!

Đoạn này chuẩn. Cũng chính là sự khác nhau giữa Insert và Block. Tuy nhiên đoạn có hay không gán được Xdata cho 1 item trong Block Collection thì chưa có test nên không dám nó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

E tưởng bác đã biết bản vẽ bác tạo Block có cái sysvar kia bằng bao nhiêu rồi chứ ^^ Không thì bật 1 lần lên là bít rùi mà. Rồi lưu vào registry, env, file, userr, thậm chí gán luôn vào Xdata của Block .... Những lần sau ta đọc lại thôi ^^

Nếu không thì đành dùng DBx

Xin lỗi mọi người em xin rút lại dòng dùng DBx (không thể / chưa thể lấy sysvar qua cách này) và gán Xdata (chưa test) ^^

Cách khả dĩ nhất vẫn là tìm chỗ lưu giá trị đó ngay lúc đầ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

Xin lỗi mọi người em xin rút lại dòng dùng DBx (không thể / chưa thể lấy sysvar qua cách này) và gán Xdata (chưa test) ^^

Cách khả dĩ nhất vẫn là tìm chỗ lưu giá trị đó ngay lúc đầu ^^

Chính xác là không thể lấy sysvar bằng cách dùng dbx Ketxu à.

  • 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

Chính xác là không thể lấy sysvar bằng cách dùng dbx Ketxu à.

Dump Object DBx :

; IAxDbDocument: IAxDbDocument Interface

; Property values:

; Application (RO) = Exception occurred

; Blocks (RO) = #<VLA-OBJECT IAcadBlocks 108fd374>

; Database (RO) = #<VLA-OBJECT IAcadDatabase 10e71234>

; Dictionaries (RO) = #<VLA-OBJECT IAcadDictionaries 108fd054>

; DimStyles (RO) = #<VLA-OBJECT IAcadDimStyles 108fd324>

; ElevationModelSpace = 0.0

; ElevationPaperSpace = 0.0

; FileDependencies (RO) = #<VLA-OBJECT IAcadFileDependencies 0952a274>

; Groups (RO) = #<VLA-OBJECT IAcadGroups 108fd2d4>

; Layers (RO) = #<VLA-OBJECT IAcadLayers 108fd3c4>

; Layouts (RO) = #<VLA-OBJECT IAcadLayouts 108fd464>

; Limits = (0.0 0.0 1.2e+006 900000.0)

; Linetypes (RO) = #<VLA-OBJECT IAcadLineTypes 108fd144>

; Materials (RO) = #<VLA-OBJECT IAcadMaterials 108fd414>

; ModelSpace (RO) = #<VLA-OBJECT IAcadModelSpace2 108fd4b4>

; Name = "D:\\Test.dwg"

; PaperSpace (RO) = #<VLA-OBJECT IAcadPaperSpace2 108fdaa4>

; PlotConfigurations (RO) = #<VLA-OBJECT IAcadPlotConfigurations 108fdaf4>

; Preferences (RO) = #<VLA-OBJECT IAcadDatabasePreferences 0952c40c>

; RegisteredApplications (RO) = #<VLA-OBJECT IAcadRegisteredApplications

108fdb44>

; SectionManager (RO) = Exception occurred

; SummaryInfo (RO) = #<VLA-OBJECT IAcadSummaryInfo 0952a6d4>

; TextStyles (RO) = #<VLA-OBJECT IAcadTextStyles 108fdcd4>

; UserCoordinateSystems (RO) = #<VLA-OBJECT IAcadUCSs 108fdc84>

; Viewports (RO) = #<VLA-OBJECT IAcadViewports 108fdc34>

; Views (RO) = #<VLA-OBJECT IAcadViews 108fdbe4>

; Methods supported:

; CopyObjects (3)

; DxfIn (2)

; DxfOut (3)

; HandleToObject (1)

; ObjectIdToObject (1)

; Open (2)

; Save ()

; SaveAs (2)

Lấy được dwgname + dwgprefix :lol: (gian chư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

Xin lỗi mọi người em xin rút lại dòng dùng DBx (không thể / chưa thể lấy sysvar qua cách này) và gán Xdata (chưa test) ^^

Cách khả dĩ nhất vẫn là tìm chỗ lưu giá trị đó ngay lúc đầu ^^

 

Chính xác là không thể lấy sysvar bằng cách dùng dbx Ketxu à.

 

2 bạn có thể nói sơ qua cách dùng DBx là như thế nào ko? DBx là gì và dùng để làm những gì?

 

Theo mình biết thì DBx là custom entity được viết bằng C++ và đi kèm với nó là 1 hàm arx để tạo ra entity đó.

Nếu bản vẽ có ObjectDBX mà file .dbx ko được load thì nó sẽ được biểu diễn thành ACAD_PROXY_ENTITY

Có gì chưa đúng mong dc bổ sung thê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

2 bạn có thể nói sơ qua cách dùng DBx là như thế nào ko? DBx là gì và dùng để làm những gì?

 

Theo mình biết thì DBx là custom entity được viết bằng C++ và đi kèm với nó là 1 hàm arx để tạo ra entity đó.

Nếu bản vẽ có ObjectDBX mà file .dbx ko được load thì nó sẽ được biểu diễn thành ACAD_PROXY_ENTITY

Có gì chưa đúng mong dc bổ sung thêm. Thanks!

Mình nghe người ta nói thì cũng nói theo cho oai, chứ chửa dùng thằng này làm gì bao giờ, mà cũng hok biết về lý thuyết thì nó là cái chi chi 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

Tôi có bài toán thế này:

- Phần mềm của tôi sau khi chạy nó sẽ tạo ra các đối tượng trên bản vẽ, VD nó là: Spline 1 thuộc lớp L1, Spline2 thuộc L2,...

- Tôi sẽ sử dụng các đối tượng này để thao tác cho các bước tiếp theo.

- Vì vậy, tôi không muốn chúng bị gán cho các đối tượng khác trên bản vẽ để khỏi nhầm lẫn khi thao tác tiếp.

Vậy có cách gì để làm cho các đối tượng của tôi có đặc tính đặc biệt như trên không?

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

Hochoaivandot xin được hỏi cách tìm đường dẫn (full) của 1 file bất kỳ (có tên file) .

Ví dụ tìm đường dẫn của file "YahooMessenger.exe"

Viết Hàm (searchfile "YahooMessenger.exe") chẳng hạn. Return "C:\\Program Files (x86)\\Yahoo!\\Messenger\\YahooMessenger.exe".

Mình đã thử hàm (findfile "YahooMessenger.exe") nhưng không được.

Xin được cảm ơn suông trước, Thanks = "Like This" khi có Reply.

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

Hochoaivandot xin được hỏi cách tìm đường dẫn (full) của 1 file bất kỳ (có tên file) .

Ví dụ tìm đường dẫn của file "YahooMessenger.exe"

Hàm (searchfile "YahooMessenger.exe") chẳng hạn. Return "C:\\Program Files (x86)\\Yahoo!\\Messenger\\YahooMessenger.exe".

Mình đã thử hàm (findfile "YahooMessenger.exe") nhưng không được.

Xin được cảm ơn suông trước, Thanks = "Like This" khi có Reply.

Theo ngu ý của tôi thì hàm findfile chỉ tìm được các file ở trong thư mục chứa bản vẽ hiện hành hoặc file nằm trong Support File Search Path nếu như không cung cấp đầy đủ đường dẫn cho nó. Và không có hàm nào tìm được cả.

Thân thương!

  • 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

Theo ngu ý của tôi thì hàm findfile chỉ tìm được các file ở trong thư mục chứa bản vẽ hiện hành hoặc file nằm trong Support File Search Path nếu như không cung cấp đầy đủ đường dẫn cho nó. Và không có hàm nào tìm được cả.

Thân thương!

 

Cảm ơn Doan Van Ha với phần trả lời về cách dùng hàm findfile (đã Like This); còn câu trả lời không có hàm nào tìm được cả mình hi vọng có 1 thành viên khác trả lời ngược lại. Mình thấy yêu cầu này cũng thực tế nên chắc sẽ có cách giải quyết (có thể phải viết hàm chứ không có sẵn).

Chờ đợ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

(defun ST:File_GetAll ( Dir typ )
 (append (mapcar '(lambda ( x ) (strcat Dir "\\" x)) (vl-directory-files Dir typ 1))
(apply 'append
 	(mapcar '(lambda ( x ) (ST:File_GetAll (strcat dir "\\" x) typ))
   	(cddr (vl-directory-files dir "*" -1))
 	)
)
 )
)

Hàm này dùng đệ quy nên cẩn thận khi dùng với số lượng file tìm lớn, dễ gây crash lắm nhá ^^

Ví dụ : (ST:File_GetAll "D:" "1.dwg")

  • Vote tăng 2

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

Chào cả nhà ! các bác giúp em vấn đề nhỏ xí : em dùng hàm IF : em cần thỏa mản 2 hoặc nhiều điều kiện thì lisp chạy công tác 1 thì có cấu trúc của hàm IF như thế nào ah. ví dụ Đ/k : a>0 và b>0 thì công việc thứ nhất sẽ đc chạy..

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

Chào cả nhà ! các bác giúp em vấn đề nhỏ xí : em dùng hàm IF : em cần thỏa mản 2 hoặc nhiều điều kiện thì lisp chạy công tác 1 thì có cấu trúc của hàm IF như thế nào ah. ví dụ Đ/k : a>0 và b>0 thì công việc thứ nhất sẽ đc chạy..

Em xin cảm ơn !

(if (and (> a 0) (> b 0))
(progn
(neu dung)
)
(progn
(neu sai)
)
)

  • 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

(if (and (> a 0) (> b 0))
(progn
(neu dung)
)
(progn
(neu sai)
)
)

Em cảm ơn bác, vậy nếu em muốn dùng ghép cùng nhiều điều kiện xảy ra luôn thì có đc ko? vd: a>0,b>0 => công việc 1. a<0,b>0 => công việc 2: a<0,b<0 => công việc 3.... vậy có thể dùng đc không bác.và nếu dùng thì cấu trúc nó như thế 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

Em cảm ơn bác, vậy nếu em muốn dùng ghép cùng nhiều điều kiện xảy ra luôn thì có đc ko? vd: a>0,b>0 => công việc 1. a<0,b>0 => công việc 2: a<0,b<0 => công việc 3.... vậy có thể dùng đc không bác.và nếu dùng thì cấu trúc nó như thế nào.

Dùng hàm COND

VD :

(cond
 ( (and (> a 0) (> b 0))
  (work1) )
 ( (and (< a 0) (> b 0))
  (work2))
 ( (and (< a 0) (< b 0))
  (work3))
 ( t ; cac t/hop khac
  (work4))
 )

  • 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

Dùng hàm COND

VD :

(cond
 ( (and (> a 0) (> b 0))
  (work1) )
 ( (and (< a 0) (> b 0))
  (work2)).....

Bác xem giúp đoạn code bảng tính này của em sai chô nào mà nó bào : error: no function definition

( Cái lisp đầu tiên trong cuộc đời đó bác :) )

 

(defun c:vm ()
( setq  a1(getdist "\n nhap chieu dai canh a1:")
   	a2(getdist "\n nhap chieu dai canh a2:")
   	a3(getdist "\n nhap chieu dai canh a3:")
   	b(getdist "\n nhap chieu rong canh b:")
   	L1(getdist "\n nhap khoang cach L1:")
   	L2(getdist "\n nhap khoang cach L2:")
   	B(getdist "\n nhap khoang cach B:")
   	Htn(getdist "\n nhap cao do tu nhien Htn:")
   	Hdm(getdist "\n nhap cao do day mong Hdm:")
   	sb(getdist "\n nhap so buoc mong:")
   	btc(getdist "\n nhap khoang cach b thi cong:")
   	hdtc(getdist "\n nhap chieu cao dao thu cong Hdtc:")
   	hbtl(getdist "\n nhap chieu day be tong lot Hbtl:")
   	m(getdist "\n nhap do soai cua dat m:")
   	)
(setq S1(- L2 (+ a2 (/ a3 2) 200 (* btc 2)))
   	S2(- B (+ b 200 (* btc 2)))
   	Hdcg(- (+ (- Htn Hdm) hbtl) hdtc))
(cond
   	((and (> S1 0) (=< S2 0))
     	(setq B0(+ (* sb B) b (* btc 2))
           	L0(+ (* L1 2) (* L2 2) (* a1 2) 200 (* btc 2))
           	B10(+ B0 (* m 2 Hdcg))
           	L10(+ L0 (* m 2 Hdcg))
   	Vdcg(/ (+ (* B0 L0) (* B10 L10) (* (+ B0 L0) (+ B10 L10))) 6)
   	Vdtc1(* hdtc 2 sb (* (+ b 200 (* btc 2)) (+ a1 a2 200 L1 ) (* btc 2)))
   	Vdtc2(* hdtc sb (* (+ a3 200) (+ b 200 (* btc 2))))
   	Vdtc(+ Vdtc1 vdtc2)
   	V(+ Vdtc Vdcg))))
   	(princ V)
   	)


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 xem giúp đoạn code bảng tính này của em sai chô nào mà nó bào : error: no function definition

( Cái lisp đầu tiên trong cuộc đời đó bác :) )

 

(defun c:vm ()
( setq  a1(getdist "\n nhap chieu dai canh a1:")
   	a2(getdist "\n nhap chieu dai canh a2:")
   	a3(getdist "\n nhap chieu dai canh a3:")
   	b(getdist "\n nhap chieu rong canh b:")
   	L1(getdist "\n nhap khoang cach L1:")
   	L2(getdist "\n nhap khoang cach L2:")
   	B(getdist "\n nhap khoang cach B:")
   	Htn(getdist "\n nhap cao do tu nhien Htn:")
   	Hdm(getdist "\n nhap cao do day mong Hdm:")
   	sb(getdist "\n nhap so buoc mong:")
   	btc(getdist "\n nhap khoang cach b thi cong:")
   	hdtc(getdist "\n nhap chieu cao dao thu cong Hdtc:")
   	hbtl(getdist "\n nhap chieu day be tong lot Hbtl:")
   	m(getdist "\n nhap do soai cua dat m:")
   	)
(setq S1(- L2 (+ a2 (/ a3 2) 200 (* btc 2)))
   	S2(- B (+ b 200 (* btc 2)))
   	Hdcg(- (+ (- Htn Hdm) hbtl) hdtc))
(cond
   	((and (> S1 0) (=< S2 0))
     	(setq B0(+ (* sb B) b (* btc 2))
           	L0(+ (* L1 2) (* L2 2) (* a1 2) 200 (* btc 2))
           	B10(+ B0 (* m 2 Hdcg))
           	L10(+ L0 (* m 2 Hdcg))
   	Vdcg(/ (+ (* B0 L0) (* B10 L10) (* (+ B0 L0) (+ B10 L10))) 6)
   	Vdtc1(* hdtc 2 sb (* (+ b 200 (* btc 2)) (+ a1 a2 200 L1 ) (* btc 2)))
   	Vdtc2(* hdtc sb (* (+ a3 200) (+ b 200 (* btc 2))))
   	Vdtc(+ Vdtc1 vdtc2)
   	V(+ Vdtc Vdcg))))
   	(princ V)
   	)


Không có hàm =< mà chỉ có hàm <=

  • Vote tăng 2

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

Hochoaivandot xin được hỏi cách tìm đường dẫn (full) của 1 file bất kỳ (có tên file) .

Ví dụ tìm đường dẫn của file "YahooMessenger.exe"

Viết Hàm (searchfile "YahooMessenger.exe") chẳng hạn. Return "C:\\Program Files (x86)\\Yahoo!\\Messenger\\YahooMessenger.exe".

Mình đã thử hàm (findfile "YahooMessenger.exe") nhưng không được.

Xin được cảm ơn suông trước, Thanks = "Like This" khi có Reply.

 

Bạn có thể tìm đường dẫn của nó trong registry (dùng (vl-registry-read reg-key [val-name]) để đọc)

 

 

Tôi có bài toán thế này:

- Phần mềm của tôi sau khi chạy nó sẽ tạo ra các đối tượng trên bản vẽ, VD nó là: Spline 1 thuộc lớp L1, Spline2 thuộc L2,...

- Tôi sẽ sử dụng các đối tượng này để thao tác cho các bước tiếp theo.

- Vì vậy, tôi không muốn chúng bị gán cho các đối tượng khác trên bản vẽ để khỏi nhầm lẫn khi thao tác tiếp.

Vậy có cách gì để làm cho các đối tượng của tôi có đặc tính đặc biệt như trên không?

Xin cám ơn!

 

Chưa hiểu ý của bác lắm. Có phải bác không muốn gán cho nó 1 biến nào đó không?

Ví dụ sau khi vẽ spline1 ta gán nó cho (setq doituong1 (entlast)), tuong tu cho spline2....

 

Nếu không muốn làm cách trên, bác có thể làm cho nó "đặc biệt" bằng cách thêm thông tin mở rộng cho 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

Dùng hàm COND như vậy có đúng không ahm, sao em chạy nó không báo gì hết !

VD :

(cond
 ( (and (> a 0) (> b 0))
  (work1) )
[b](princ "\n dong nhac bao ket qua cua CV1 neu xay ra:")[/b]
 ( (and (< a 0) (> b 0))
  (work2))
[b](princ"\n dong nhac bao ket qua cua CV2 neu xay ra:")[/b]
 ( (and (< a 0) (< b 0))
  (work3))
[b](princ"\n dong nhac bao ket qua cua CV2 neu xay ra:")[/b]
 )

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

×