Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp insert field file name bỏ đi một số ký tự


  • Please log in to reply
42 replies to this topic

#21 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 17 December 2012 - 03:47 PM

Bạn tự sử dụng Field Layer để phát hiện ra công thức, sau đó tìm hàm GetObjectID64 trên diễn đàn, strcat cái công thức + ObjectID ghi đè lên text, thế là có cái bạn cần, bạn thử làm xem sao :) Mình đoán mất mấy phút thôi ^^
  • 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


#22 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 17 December 2012 - 03:54 PM

Dạ, yêu cầu thế này bác ạ:
- Chỉ lên một đối tượng để lấy tên layer
- Cắt đầu nó n ký tự
- Đè lên một cái text có sẵn
Cám ơn bác Hạ!


(defun C:HA( / num ent1 ent2 lay)
(initget 7) (setq num (getint "\nSo ky tu can cat bot: "))
(while
(and
(setq ent1 (car (entsel "\nChon 1 doi tuong de lay Layer: ")))
(setq ent2 (car (entsel "\nChon 1 Text de ghi len no: "))))
(if (> (strlen (setq lay (cdr (assoc 8 (entget ent1))))) num)
(vla-put-textstring (vlax-ename->vla-object ent2) (substr lay (1+ num))))))

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#23 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 17 December 2012 - 03:57 PM

Thật tình mình không rành về các hàm VBA. Lần trước về tên file, mình thấy ketxu lập bằng diesel, cái này thì mình biết. Nhưng diesel không lấy thông tin của đối tượng được! Mình sẽ tìm hiểu sau vậy, tạm thời bây giờ mong được các bác giúp đỡ, xin cám ơn nhiều! :)
  • 0

#24 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 17 December 2012 - 04:01 PM


(defun C:HA( / num ent1 ent2 lay)
(initget 7) (setq num (getint "\nSo ky tu can cat bot: "))
(while
(and
(setq ent1 (car (entsel "\nChon 1 doi tuong de lay Layer: ")))
(setq ent2 (car (entsel "\nChon 1 Text de ghi len no: "))))
(if (> (strlen (setq lay (cdr (assoc 8 (entget ent1))))) num)
(vla-put-textstring (vlax-ename->vla-object ent2) (substr lay (1+ num))))))


Cám ơn bác Hạ! Mình muốn text này liên kết động với tên layer được không bác? Nghĩa là lúc mình đổi tên layer thì nó cũng thay đổi theo ấy!
  • 0

#25 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 17 December 2012 - 04:17 PM

Thật tình mình không rành về các hàm VBA. Lần trước về tên file, mình thấy ketxu lập bằng diesel, cái này thì mình biết. Nhưng diesel không lấy thông tin của đối tượng được! Mình sẽ tìm hiểu sau vậy, tạm thời bây giờ mong được các bác giúp đỡ, xin cám ơn nhiều! :)

Sao lại hàm VBA ở đây bạn ^^ Bạn đã thử như mình nói chưa ? Và bạn dùng Field chưa (Field -> Object -> Select Object -> Property Layer )
Cấu trúc đoạn string sẽ dạng này :

%<\AcObjProp Object(%<\_ObjId 2130326624>%).Layer>%
  • 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


#26 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 17 December 2012 - 04:31 PM

Mình cũng đang làm theo cách này, nhưng chỉ biết lấy "y nguyên" thôi, còn xử lý nó (như cắt bớt vài ký tự) thì mình chịu thua!!
P/S: Cái này không phải là VBA hả bạn? Mình thấy nó nằm trong mục "ActiveX and VBA Reference" của help, vậy chắc nó là ActiveX nhỉ?? :) Cái này mình cũng chịu, chưa nghiên cứu!
  • 0

#27 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 19 December 2012 - 03:35 PM

Bạn tự sử dụng Field Layer để phát hiện ra công thức, sau đó tìm hàm GetObjectID64 trên diễn đàn, strcat cái công thức + ObjectID ghi đè lên text, thế là có cái bạn cần, bạn thử làm xem sao :) Mình đoán mất mấy phút thôi ^^

Lấy được rồi nhưng không biết làm sao cắt bớt đi vài ký tự bạn ạ!
  • 0

#28 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 December 2012 - 06:20 PM

Thì bạn lại lấy lại bài của mình, đọc công thức diesel Substr trong đó ^^
  • 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


#29 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 20 December 2012 - 09:32 AM

Bạn tự sử dụng Field Layer để phát hiện ra công thức, sau đó tìm hàm GetObjectID64 trên diễn đàn, strcat cái công thức + ObjectID ghi đè lên text, thế là có cái bạn cần, bạn thử làm xem sao :) Mình đoán mất mấy phút thôi ^^

Tìm mãi mà chẳng thấy hàm "GetObjectID64" ở đâu trên diễn đàn bạn ạ!!
  • 0

#30 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 20 December 2012 - 10:09 AM

Get và Put thì như vầy, còn Cut bằng Diesel thì cũng có thể làm được, nhưng đưa từ Diesel vào Field thì mình cũng chưa hiểu lắm.
Get và Put:
(setq txt (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid (vlax-ename->vla-object ent))) ">%).Layer>%"))
(vla-put-textstring (vlax-ename->vla-object ent_text) txt)))))
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#31 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 December 2012 - 10:10 AM

LL search từ defun ObjectID kèm theo số 64 tách ra dùng cho CAD64bit
  • 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


#32 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 20 December 2012 - 11:41 AM

Get và Put thì như vầy, còn Cut bằng Diesel thì cũng có thể làm được, nhưng đưa từ Diesel vào Field thì mình cũng chưa hiểu lắm.
Get và Put:
(setq txt (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid (vlax-ename->vla-object ent))) ">%).Layer>%"))
(vla-put-textstring (vlax-ename->vla-object ent_text) txt)))))

Vì field chấp nhận diesel mà bác!
  • 0

#33 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 December 2012 - 11:55 AM

Đối số Diesel giống hệt lisp, lẽ nào bạn k ra được :(
  • 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


#34 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 20 December 2012 - 01:53 PM

Mình làm rồi nhưng sao text tạo ra không link với tên layer, nghĩa là khi đổi tên layer xong, regen thì nó không đổi theo!
Nhờ bác xem giúp mình với!
(defun c:fla()
(if (setq ent (entsel "\nChon doi tuong de xac dinh layer: "))
(progn
(setq txt (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-objectid (vlax-ename->vla-object (car ent)))) ">%).Layer>%")
txt (strcat "%<$(substr, " txt ", 5) >%"))
(vla-addmtext (vla-get-block (vla-get-activelayout(vla-get-activedocument (vlax-get-acad-object))))
(vlax-3d-point (getpoint "\nDiem chen Field"))
1
txt)
)
)
(princ)
)
p/s: Mình không thể đặt trong cặp dấu CODE được, nó không hiển thị như mình mong muốn!
  • 0

#35 Chiron

Chiron

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 20 December 2012 - 02:59 PM

Tìm mãi mà chẳng thấy hàm "GetObjectID64" ở đâu trên diễn đàn bạn ạ!!

Có phải cái này: http://www.cadviet.c...showtopic=28405
Thì nó đây:

(defun GetObjectID (obj)
(if (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
(vlax-invoke-method *util 'GetObjectIdString obj :vlax-false )
(vla-get-Objectid obj)))

  • 1

#36 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 December 2012 - 03:06 PM

Mình làm rồi nhưng sao text tạo ra không link với tên layer, nghĩa là khi đổi tên layer xong, regen thì nó không đổi theo!
Nhờ bác xem giúp mình với!

p/s: Mình không thể đặt trong cặp dấu CODE được, nó không hiển thị như mình mong muốn!

Ồ, nghĩ ra mới thấy cũng không phải đơn giản bạn ạ ^^
  • 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


#37 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 20 December 2012 - 03:21 PM

ồ, hèn gì mình không làm được!! ket có giải pháp nào không?
  • 0

#38 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 21 December 2012 - 11:13 AM

Theo dõi y/c của Lovelisp một hồi + Ngâm cứu Diesel một hồi nữa, cuối cùng nhận thấy:
1). Với yêu cầu này thì không thể dùng diesel được. Lý do: diesel không có hàm để lấy tên layer. Còn nếu lấy tên layer bằng lisp rồi nhét vào diesel thì tên ấy sẽ bất động, chứ không thể update theo sự thay đổi tên layer được => từ bỏ ý định dùng diesel với y/c này.
2). Không biết có thể dùng thuần lisp để cắt bớt 1 số ký tự của field layer hay không? Nhưng nếu được thì cũng chả dễ dàng gì => đang ngâm cứu xem sao.
@Lovelisp: thank bạn, vì nhờ bạn mà có dịp ngụp lặn trong diesel, nên hiểu được tí xíu về nó.
@Ketxu: cái này chém trúng... gió rồi. :lol:
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#39 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 December 2012 - 11:25 AM

Ketxu thi nghĩ : Một là dùng reactor
Hai là Redefine lại lệnh Regen + Xdata
..... (và nhiều giải pháp khác)

Tất nhiên k khoái bằng field được ^^
  • 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


#40 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 21 December 2012 - 12:24 PM

ồ, vấn đề này khó khăn hơn mình tưởng rồi đây...
  • 0