Đến nội dung


Hình ảnh
* * * - - 1 Bình chọn

LISP : Ánh xạ giá trị đối tượng (thay đổi giá trị nguồn -> Đích cập nhật theo)


  • Please log in to reply
76 replies to this topic

#41 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 05 May 2011 - 03:04 PM

Nhân tiện đây nhờ mọi người chỉnh sửa dùm em 1 chút về lips LinkT như sau:
- Khi chọn đối tượng nguồn thì mình có thể chọn được nhiều đối tượng nguồn cho 1 đối tượng đích.
- Khi copy 1 đối tượng nguồn thì đối tượng mới được copy vẫn được hiểu là 1 phần đối tượng nguồi của đối tượng đích mà mình vừa copy.
Cá mơn Bác nhiều!
Đây là file cad mẫu: http://www.cadviet.c...mau_cadviet.dwg

Ơ, sao lại nhân tiện nhỉ ?!

Lisp cộng các TEXT đã chọn rồi ghi vào Text đích :
(T/hợp copy ... -> chạy lại lisp này :) )
(defun c:CongT (/ fieldexp obj sole ss);Cong Text
;; By : Gia_Bach, www.CadViet.com ;;
(vl-load-com)
(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
(if (and
(princ "\nChon cac Text can tinh tong : ")
(setq ss (ssget '((0 . "TEXT"))))
(setq obj (car (entsel "\nChon Text ghi tong : "))))
(progn
(or *sole* (setq *sole* 0))
(initget 4)
(setq sole (getint (strcat "\n So chu so thap phan <" (itoa *sole*) "> :")))
(if (not sole) (setq sole *sole*) (setq *sole* sole))
(setq fieldExp "%<\\AcExpr (0")
(foreach e (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq fieldExp (strcat fieldExp
"+%<\\AcObjProp Object(%<\\_ObjId "
(itoa (vla-get-objectid e))
">%).TextString>%")) )
(vla-put-TextString (vlax-ename->vla-object obj) (strcat fieldExp ") \\f \"%lu2%pr" (itoa sole) "\">%"))
(princ)))
(alert "\nChi chay tu Autocad 2006") ) )

  • 1

#42 18011985

18011985

    biết lệnh properties

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

Đã gửi 05 May 2011 - 03:16 PM

Nhân tiện vụ ánh xạ, các bác chỉ dùm em một chút.
Em có 2 hình chữ nhật và muốn tính diện tích.
- Khi em chọn hình 1 thì diện tích được lưu dữ trong máy, chọn hình thứ 2 xong ấn enter hoặc chuột phải để kết thúc. Và chọn vị trí ghi diện tích. (Đây là chiều thuận không xảy ra lỗi).
- Khi em chọn xong hình 1, em chọn hình 2 nhưng ấn nhầm hình 1 máy tự động lọc dữ liệu và thông báo vùng này đã tính và không ghi dữ liệu. Tiếp đó sau khi em chọn xong hình 2 chưa ấn enter em tiếp tục chọn hình 1 hoặc hình 2 thì lại báo lỗi hình này đã được tính.
Em đang mắc vụ lọc dữ liệu vùng pick rồi và vùng chưa pick. Rất mong các bác giúp đỡ.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#43 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 05 May 2011 - 03:44 PM

Nhân tiện vụ ánh xạ, các bác chỉ dùm em một chút.
Em có 2 hình chữ nhật và muốn tính diện tích.
- Khi em chọn hình 1 thì diện tích được lưu dữ trong máy, chọn hình thứ 2 xong ấn enter hoặc chuột phải để kết thúc. Và chọn vị trí ghi diện tích. (Đây là chiều thuận không xảy ra lỗi).
- Khi em chọn xong hình 1, em chọn hình 2 nhưng ấn nhầm hình 1 máy tự động lọc dữ liệu và thông báo vùng này đã tính và không ghi dữ liệu. Tiếp đó sau khi em chọn xong hình 2 chưa ấn enter em tiếp tục chọn hình 1 hoặc hình 2 thì lại báo lỗi hình này đã được tính.
Em đang mắc vụ lọc dữ liệu vùng pick rồi và vùng chưa pick. Rất mong các bác giúp đỡ.

Cái này mình nghĩ bạn có thể dựa theo Handle hoặc ename của hình đó mà ?Mỗi lần pick thì đưa nó vào 1 list, pick tiếp thì đưa tiếp vào list, kiểm tra member hoặc vl-positon của đối tượng mới, có rồi thì thông báo và hủy đi :)
Tuy nhiên, việc pick chọn đối tượng như bạn nói đầu bài với lại pick vào khoảng trống như bạn nói cuối bài lại khác nhau hoàn toàn :)
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#44 xuandao0708

xuandao0708

    biết lệnh scale

  • Members
  • PipPipPip
  • 140 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 06 May 2011 - 01:07 PM

Bác Gia-Bach ơi cho em hỏi chút, yêu cầu số 1 thì giống ý em rồi, còn yêu cầu thứ 2 thì có thể thực hiện được không vậy bác?
- Có thể copy thêm nhiều đối tượng nguồn từ những đối tượng nguồn đã có đối tượng đích nhưng những đối tượng nguồn vừa được copy thì nó vẫn hiểu là chung đối tượng đích với đối tượng nguồn được copy.
Đây là file cad: http://www.cadviet.c...files/3/mau.dwg
  • 0

#45 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 06 May 2011 - 04:11 PM

Bác Gia-Bach ơi cho em hỏi chút, yêu cầu số 1 thì giống ý em rồi, còn yêu cầu thứ 2 thì có thể thực hiện được không vậy bác?
- Có thể copy thêm nhiều đối tượng nguồn từ những đối tượng nguồn đã có đối tượng đích nhưng những đối tượng nguồn vừa được copy thì nó vẫn hiểu là chung đối tượng đích với đối tượng nguồn được copy.
Đây là file cad: http://www.cadviet.c...files/3/mau.dwg

Chào xuandao0708.

Về mặt lập trình, tôi cho rằng LISP có thể thực hiện đuợc yêu cầu của bạn :excl: (Sử dụng REACTOR)
Đây là 1 ý tuởng hay. :rolleyes:
Tuy nhiên việc triển khai yêu cầu này có thể tốn khá nhiều thời gian.
Xin mời các Lisper có thời gian và lòng đam mê tham gia "ngâm kíu" giùm bạn xuandao0708.

Trong khi chờ đợi "ai đó" viết lisp này, mỗi khi copy bạn chịu khó chạy lại lisp CongT ở trên.
  • 1

#46 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 06 May 2011 - 04:41 PM

Về mặt sử dụng, em thấy chẳng lâu hơn là bao với 1 thao tác lặp lại lệnh CongT
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#47 duyhung

duyhung

    biết vẽ rectang

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

Đã gửi 06 May 2011 - 05:19 PM

Hi mình thấy list congT rất hay xong nếu có thêm phần 2 là update nếu copy text thì hay hơn nữa, vì khi tính toán có thể vì một lúc đãng trí sẽ không lặp lại lisp congT nên kq sẽ không update được.
Ah khi xuất kết quả có thể thêm 3 lựa chọn giống như lisp Tcal đã up lên diễn đàn thì hay.
Thanks.
  • 0
Song va chien dau!

#48 18011985

18011985

    biết lệnh properties

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

Đã gửi 07 May 2011 - 09:11 AM

Cái này mình nghĩ bạn có thể dựa theo Handle hoặc ename của hình đó mà ?Mỗi lần pick thì đưa nó vào 1 list, pick tiếp thì đưa tiếp vào list, kiểm tra member hoặc vl-positon của đối tượng mới, có rồi thì thông báo và hủy đi :)
Tuy nhiên, việc pick chọn đối tượng như bạn nói đầu bài với lại pick vào khoảng trống như bạn nói cuối bài lại khác nhau hoàn toàn :)

ý mình nó như thía nè.
Pick vào 1 vùng (kín) nó sẽ tạo ra 1 vùng khác nhờ lệnh boundary. Pick lại cái vùng đó thì báo đã pick rồi, và sau khi pick 1 vài vùng khác pick lại nó thì vẫn báo pick rồi. Đơn giản chỉ như vậy thui bạn à.
Lisp udt bị lỗi như vậy đó.
http://www.cadviet.c...opic=2490&st=40
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#49 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 07 May 2011 - 09:50 AM

Thì lúc đầu bạn nói là chọn Object mà. Đến cuối mới nói pick vùng. Nếu pick vùng, chắc bạn phải lưu lại toàn bộ list vertex point của Boundary tạo ra rồi. Khi tính diện tích mà thấy S trùng nhau thì kiểm tra lại list point đó xem có trùng không. Hoặc bạn tìm trọng tâm Boundary để ghi vào list, nếu trùng tâm thì coi như trùng vùng. Việc 2 vùng khác nhau mà trùng điểm này cũng khó xảy ra, nên có thể tạm chấp nhận được
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#50 18011985

18011985

    biết lệnh properties

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

Đã gửi 07 May 2011 - 10:27 AM

hix lâu lâu không sờ đến lsp cho mình hỏi trọng tâm hình là mã DXF bao nhiêu nhỉ?
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#51 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 07 May 2011 - 10:50 AM

hix lâu lâu không sờ đến lsp cho mình hỏi trọng tâm hình là mã DXF bao nhiêu nhỉ?

Mã DXF này :
 (defun mid (ent / p1 p2)
(vla-getboundingbox (vlax-ename->vla-object ent) 'p1 'p2)
(setq p1 (vlax-safearray->list p1)
p2 (vlax-safearray->list p2)
pt (mapcar '+ p1 p2)
pt (mapcar '* pt '(0.5 0.5 0.5))
)
pt
)
P/S : lâu hok sờ đến mà làm việc khó vậy bác ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#52 xuandao0708

xuandao0708

    biết lệnh scale

  • Members
  • PipPipPip
  • 140 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 07 May 2011 - 11:00 AM

Thank mọi người nhiều, chắc thực hiện thao tác giống ketxu nói cho dễ hơn.
  • 0

#53 duchieu0205

duchieu0205

    biết vẽ line

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

Đã gửi 13 May 2011 - 05:42 PM

Chào master_worse
Rất tiếc là lệnh FIELD trong CAD chưa cho phép làm điều này.

Nếu thé có thể làm ngược lại

"tập nguồn 1: %%c8
tập nguồn 2: a200
tập đích link là: %%c8a200
""
được không các bạn?
  • 0

#54 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 14 May 2011 - 08:29 AM

Nếu thé có thể làm ngược lại

"tập nguồn 1: %%c8
tập nguồn 2: a200
tập đích link là: %%c8a200
""
được không các bạn?

Tạm hiểu "lờ mờ" ý của bạn ?!
Nhưng làm được hay không thì tôi chưa biết (vì chưa rõ vấn đề, đừng bắt người đọc làm "thầy bói xem voi").

Trước mắt là bạn nên trình bày vấn đề 1 cách cụ thể hơn.
  • 0

#55 duchieu0205

duchieu0205

    biết vẽ line

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

Đã gửi 17 May 2011 - 03:11 PM

Tạm hiểu "lờ mờ" ý của bạn ?!
Nhưng làm được hay không thì tôi chưa biết (vì chưa rõ vấn đề, đừng bắt người đọc làm "thầy bói xem voi").

Trước mắt là bạn nên trình bày vấn đề 1 cách cụ thể hơn.


Hu hu có lẽ em dốt văn quá đây mà! ý em muống các bác viết lisp ánh xạ từ 2 hay nhiều nguồn đến chung 1 đích ! đấy là một dạng cộng text nhưng không phải cộng đại số như lệnh CT mà các anh đã viết chỉ giản đơn là ghép các chuỗi text lại với nhau theo thứ tự chọn! Cám ơn các anh đã để tâm!
  • 0

#56 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 17 May 2011 - 04:18 PM

Hu hu có lẽ em dốt văn quá đây mà! ý em muống các bác viết lisp ánh xạ từ 2 hay nhiều nguồn đến chung 1 đích ! đấy là một dạng cộng text nhưng không phải cộng đại số như lệnh CT mà các anh đã viết chỉ giản đơn là ghép các chuỗi text lại với nhau theo thứ tự chọn! Cám ơn các anh đã để tâm!

LISP : Ghép các chuỗi text lại với nhau theo thứ tự chọn.
(defun c:JT (/ fieldexp obj sel ss);Joint Text
;; By : Gia_Bach, www.CadViet.com ;;
(vl-load-com)
(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
(progn
(setq ss (ssadd))
(while (setq sel (entsel "\nChon cac Text can noi voi nhau: "))
(setq ent (car sel))
(if (= (cdr (assoc 0 (entget ent))) "TEXT") (ssadd ent ss)) )
(if (and
(> (sslength ss) 0)
(setq fieldExp"")
(setq obj (car (entsel "\nChon Text ghi ket qua : ")) ))
(progn
(foreach e (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq fieldExp (strcat fieldExp
"%<\\AcObjProp Object(%<\\_ObjId "
(itoa (vla-get-objectid e))
">%).TextString>%")) )
(vla-put-TextString (vlax-ename->vla-object obj) fieldExp)
(princ))))
(alert "\nChi chay tu Autocad 2006") ) )

  • 0

#57 duchieu0205

duchieu0205

    biết vẽ line

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

Đã gửi 17 May 2011 - 04:31 PM

LISP ghép các chuỗi text lại với nhau theo thứ tự chọn.

(defun c:JT (/ fieldexp obj sel ss);Joint Text
;; By : Gia_Bach, www.CadViet.com ;;
(vl-load-com)
(if (> (atof (substr (getvar "ACADVER") 1 4)) 16.1) ;;;AutoCAD 2006 16.2
(progn
(setq ss (ssadd))
(while (setq sel (entsel "\nChon cac Text can noi voi nhau: "))
(setq ent (car sel))
(if (= (cdr (assoc 0 (entget ent))) "TEXT") (ssadd ent ss)) )
(if (and
(> (sslength ss) 0)
(setq fieldExp"")
(setq obj (car (entsel "\nChon Text ghi ket qua : ")) ))
(progn
(foreach e (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(setq fieldExp (strcat fieldExp
"%<\\AcObjProp Object(%<\\_ObjId "
(itoa (vla-get-objectid e))
">%).TextString>%")) )
(vla-put-TextString (vlax-ename->vla-object obj) fieldExp)
(princ))))
(alert "\nChi chay tu Autocad 2006") ) )


Tốt quá rồi anh Gia Bạch ơi! nhưng em có một đề xuất nhỏ này không biết có được không ạ! giờ này áp dụng cho text thì được rồi nhưng nếu em muốn link cho các dòng text của block có thuộc tính thì phải viết thêm gì nữa anh? Ngoài ra khi sử dụng link nhiều trong bản vẽ thì bản vẽ có vẻ nặng hơn thì phải
  • 0

#58 xuandao0708

xuandao0708

    biết lệnh scale

  • Members
  • PipPipPip
  • 140 Bài viết
Điểm đánh giá: 8 (bình thường)

Đã gửi 07 June 2011 - 10:18 PM

Nhờ Bác Gia_Bach và mọi người giúp đỡ thêm như sau:
1/ Hiện giờ lisp linhA của bác gia_bach thì phải chọn đối tượng là 1 đường pline kín, nếu được thì có thể kích vào giữa vùng kín là những đường line vì trên bản vẽ phân lô tổng thể của mình thì đó là những đường line đơn lẽ, nếu phải tạo thành những vùng kín bằng pline cho từng lô đơn lẽ thì bản vẽ rất nặng và lâu
2/ Muốn chỉnh số lẽ là 1 thì phải chỉnh như thế nào?
Đây là file mẫu, 1 phần của dự án phân lô tổng thể xã Phong Phu
http://www.cadviet.c...les/3/mau_4.dwg
  • 0

#59 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 08 June 2011 - 09:58 AM

Nhờ Bác Gia_Bach và mọi người giúp đỡ thêm như sau:
1/ Hiện giờ lisp linhA của bác gia_bach thì phải chọn đối tượng là 1 đường pline kín, nếu được thì có thể kích vào giữa vùng kín là những đường line vì trên bản vẽ phân lô tổng thể của mình thì đó là những đường line đơn lẽ, nếu phải tạo thành những vùng kín bằng pline cho từng lô đơn lẽ thì bản vẽ rất nặng và lâu
2/ Muốn chỉnh số lẽ là 1 thì phải chỉnh như thế nào?
Đây là file mẫu, 1 phần của dự án phân lô tổng thể xã Phong Phu
http://www.cadviet.c...les/3/mau_4.dwg

Truớc tiên, bạn thử trình bày các buớc tạo "link tính diện tính vùng kín từ những đường line" bằng CAD.

Sau đó tôi sẽ "cố gắng" chuyển nó qua LISP giùm bạn.
  • 1

#60 leejang

leejang

    biết lệnh move

  • Members
  • PipPipPip
  • 120 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 08 June 2011 - 10:10 AM

Nếu đúng như vậy thì em hãy sử dụng Lisp này
Khi sử dụng Lisp này thì yêu cầu tập hợp text của T= { X1, X2, X3, ....., Xn } phải nằm trong 1 Group
tức là các đối tượng X1, X2, X3, ....., Xn thuộc 1 group -> X1, X2, X3, ....., Xn là các Text được thành lập bởi lệnh Group
và CAD phải ở chế độ hiển thị Group ON
Sử dụng Code sau. Hy vọng bạn hài lòng

(defun c:Lchu(/ e p socu somoi D ss i ent)
(setq e (entsel "\n Chon Text nguon trong Group can chinh sua :"))
(setq p (cadr e) dt (car e))
(setq socu (atof (cdr(assoc 1 (entget dt)))))
(setq somoi (getreal (strcat "\n Nhap so moi <" (rtos socu) "> :")))
(setq D (- somoi socu))
(setq ss (ssget p) i 0)

(if (not tpo) (setq tpo 0))
(setq tp (getint (strcat "\n So chu so thap phan <" (itoa tpo) "> :")))
(if (not tp) (setq tp tpo) (setq tpo tp))

(while (< i (sslength ss))
(setq ent (entget (ssname ss i)))
(if (distof (cdr(assoc 1 ent)))
(progn
(setq so (+ (atof (cdr(assoc 1 ent))) D))
(setq ent (entmod (subst (cons 1 (rtos so 2 tp)) (assoc 1 ent) ent)))
)
)
(setq i (1+ i))
)
(princ)
)

Lisp này quả thật rất hay nhưng làm sao để xoá Link đó đi ạ ? Vì trong thực tế có nhiều bản vẽ người vẽ ko vẽ đúng tỷ lệ, do đó ta phải Scale đi để tính toán cho đúng rùi Scale lại. Làm sao để xoá link đó đi ạ ?
  • 0