Đến nội dung


Hình ảnh
- - - - -

Sử dụng ClipBoard trong LISP : Copy và Paste dữ liệu kiểu Text


  • Please log in to reply
17 replies to this topic

#1 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 13 October 2009 - 04:15 PM

Giới thiệu với các bạn đọan LISP (vừa sưu tầm đuợc) lưu và lấy dữ liệu kiểu Text từ ClipBoard
Hàm SetClipBoardText By XShrimp : lưu dữ liệu kiểu Text vào ClipBoard
Hàm GetClipBoardText By Patrick_35 : lấy dữ liệu kiểu Text từ ClipBoard

Ứng dụng :

- Bản vẽ A có một Text (gọi là nguồn)
- Bản vẽ B, C ... có rất nhiều text (gọi là đích) có các nội dung không giống nhau
- Sau khi thực hiện lệnh [chọn đối tượng nguồn >enter> chọn các đối tựong đích >enter> ]thì các đối tượng đích sẽ có nội dung của đối tượng nguồn.

Trong CAD
- trên bản vẽ A gọi lệnh copy2 -> chọn Text nguồn,
- trên bản vẽ B, C ... gọi lệnh paste2 -> chọn các đối tựong đích >enter :bigsmile:

Với các Text từ nguồn khác như : Word, Excel , trình duyệt, … : hàm GetClipBoardText bỏ qua các đối tuợng đồ họa (image), chỉ chọn ra Text. Đặc biệt trong Excel : cho phép copy dữ liệu trong nhiều cell.
(vl-load-com)
(defun c:copy2 (/ ent str); Copy to ClipBoard
(if
(and
(setq ent (car (entsel (strcat"\nChon Text de luu vao ClipBoard <<" (if (setq str (GetClipBoardText)) (Trim_Str str 15) "nil") ">> :"))))
(wcmatch (cdr (assoc 0 (entget ent))) "*TEXT") )
(princ (strcat"\nDa luu <<" (SetClipBoardText (cdr (assoc 1 (entget ent)))) ">> vao ClipBoard." ))
(alert "Chon doi tuong khong hop le.")
)
(princ)
)

(defun c:paste2 (/ obj str ss); Paste from ClipBoard
(if (setq str (GetClipBoardText))
(progn
(princ (strcat "\nChon text de gan gia tri tu ClipBoard <<" (Trim_Str str 15) ">> :"))
(setq ss (ssget (list (cons 0 "*TEXT")) ))
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(vla-put-TextString (vlax-ename->vla-object e) str) )
)
(alert (strcat "Gia tri ClipBoard hien hanh khong phai kieu String."
"\nGoi lenh Copy2 de luu gia tri vao ClipBoard."))
)
(princ)
)

(defun Trim_Str(Str len)
(if(and Str (< len (strlen Str)))
(strcat(substr Str 1 len)"...")
Str
))
(defun SetClipBoardText (text / htmlfile result ) ; By XShrimp
(if (= 'STR (type text))
(progn
(setq htmlfile (vlax-create-object "htmlfile")
result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'SetData "Text" text ) )
(vlax-release-object htmlfile)
text
))
)
(defun GetClipBoardText( / htmlfile result ) ; By Patrick_35
(setq htmlfile (vlax-create-object "htmlfile")
result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'GetData "Text" ) )
(vlax-release-object htmlfile)
result
)

  • 10

#2 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 13 October 2009 - 05:55 PM

Cái này đúng là tuyệt thật, bản thân em đã từng chủ quan nghĩ rằng lisp không thể can thiệp vào clipboad của window. đúng là autolisp thật là tuyệt vời.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#3 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 14 October 2009 - 07:00 AM

Bác có thể upgrade LISP trên để có thể thực hiện được liên tục các bước copy-paste mà không cần phải nhập lại lệnh, thí dụ:
1- Đánh lệnh Copy2, chọn một Text của b/v A
2- Đánh lệnh Paste2, chọn Text ở b/v B để thay thế
3- Chọn Text khác của b/v A
4. Chọn Text khác của b/v B để thay thế
5. Cứ tiếp tục như thế...
...
ESC/ENTER để exit.
Thank you.
  • 0

#4 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 14 October 2009 - 07:11 AM

Bác có thể upgrade LISP trên để có thể thực hiện được liên tục các bước copy-paste mà không cần phải nhập lại lệnh, thí dụ:
1- Đánh lệnh Copy2, chọn một Text của b/v A
2- Đánh lệnh Paste2, chọn Text ở b/v B để thay thế
3- Chọn Text khác của b/v A
4. Chọn Text khác của b/v B để thay thế
5. Cứ tiếp tục như thế...
...
ESC/ENTER để exit.
Thank you.

Bác tham khảo Lisp TTC dưới đây của AsmiTools (chỉ dùng trong 1 b/v mà thôi)
- Đánh lệnh TTC rồi đánh P
- Chọn Text để copy
- Chọn Text khác để thay thế
- Cứ tiếp tục copy-paste ...
Demo: http://www.asmitools.../Lisps/Ttc.html

;; ==================================================================== ;;
;; ;;
;; TTC.LSP - The program copies the text from: DText, MText, ;;
;; Tables, Dimensions, Attributes, Attributes, ;;
;; Attributes Definitions, DText, MText and inner ;;
;; block's DText and MText to: DText, MText, Tables, ;;
;; Attribures and Attributes Definitions. There are ;;
;; Multiple and Pair-wise modes. ;;
;; ;;
;; ==================================================================== ;;
;; ;;
;; Command(s) to call: TTC ;;
;; ;;
;; ==================================================================== ;;
;; ;;
;; THIS PROGRAM AND PARTS OF IT MAY REPRODUCED BY ANY METHOD ON ANY ;;
;; MEDIUM FOR ANY REASON. YOU CAN USE OR MODIFY THIS PROGRAM OR ;;
;; PARTS OF IT ABSOLUTELY FREE. ;;
;; ;;
;; THIS PROGRAM PROVIDES 'AS IS' WITH ALL FAULTS AND SPECIFICALLY ;;
;; DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS ;;
;; FOR A PARTICULAR USE. ;;
;; ;;
;; ==================================================================== ;;
;; ;;
;; V1.3, 29 November, 2005, Riga, Latvia ;;
;; © Aleksandr Smirnov (ASMI) ;;
;; For AutoCAD 2000 - 2008 (isn't tested in a next versions) ;;
;; ;;
;; [url="http://www.asmitools.com"]http://www.asmitools.com[/url] ;;
;; ;;
;; ==================================================================== ;;

(defun c:ttc (/ actDoc vlaObj sObj sText curObj oldForm
oType oldMode conFlag errFlag *error*)

(vl-load-com)

(setq actDoc(vla-get-ActiveDocument
(vlax-get-acad-object)))
(vla-StartUndoMark actDoc)

(defun TTC_Paste(pasteStr / nslLst vlaObj hitPt
hitRes Row Column)
(setq errFlag nil)
(if
(setq nslLst(nentsel "\nPaste text >"))
(progn
(cond
((and
(= 4(length nslLst))
(= "DIMENSION"(cdr(assoc 0(entget(car(last nslLst))))))
); end and
(setq vlaObj(vlax-ename->vla-object
(cdr(assoc -1(entget(car(last nslLst)))))))
(if
(vl-catch-all-error-p
(vl-catch-all-apply
'vla-put-TextOverride(list vlaObj pasteStr)))
(progn
(princ "\n Can't paste. Object may be on locked layer ")
(setq errFlag T)
); end progn
); end if
); end condition #1
((and
(= 4(length nslLst))
(= "ACAD_TABLE"(cdr(assoc 0(entget(car(last nslLst))))))
); end and
(setq vlaObj
(vlax-ename->vla-object
(cdr(assoc -1(entget(car(last nslLst))))))
hitPt(vlax-3D-Point(trans(cadr nslLst)1 0))
hitRes(vla-HitTest vlaObj hitPt
(vlax-3D-Point '(0.0 0.0 1.0)) 'Row 'Column)
); end setq
(if(= :vlax-true hitRes)
(progn
(if(vl-catch-all-error-p
(vl-catch-all-apply
'vla-SetText(list vlaObj Row Column pasteStr)))
(progn
(princ "\n Can't paste. Object may be on locked layer ")
(setq errFlag T)
); end progn
); end if
); end progn
); end if
); end condition # 2
((and
(= 4(length nslLst))
(= "INSERT"(cdr(assoc 0(entget(car(last nslLst))))))
); end and
(princ "\n Can't paste to block's DText or MText ")
(setq errFlag T)
); end condition #3
((and
(= 2(length nslLst))
(member(cdr(assoc 0(entget(car nslLst))))
'("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))
); end and
(setq vlaObj(vlax-ename->vla-object(car nslLst)))
(if(vl-catch-all-error-p
(vl-catch-all-apply
'vla-put-TextString(list vlaObj pasteStr)))
(progn
(princ "\n Error. Can't pase text ")
(setq errFlag T)
); end progn
); end if
); end condition #4
(T
(princ "\n Can't paste. Invalid object ")
(setq errFlag T)
); end condition #5
); end cond
T
); end progn
nil
); end if
); end of TTC_Paste


(defun TTC_MText_Clear(Mtext / Text Str)
(setq Text "")
(while(/= Mtext "")
(cond
((wcmatch(strcase
(setq Str
(substr Mtext 1 2)))"\\[\\{}`~]")
(setq Mtext(substr Mtext 3)
Text(strcat Text Str)
); end setq
); end condition #1
((wcmatch(substr Mtext 1 1) "[{}]")
(setq Mtext
(substr Mtext 2))
); end condition #2
((and
(wcmatch
(strcase
(substr Mtext 1 2)) "\\P")
(/=(substr Mtext 3 1) " ")
); end and
(setq Mtext (substr Mtext 3)
Text (strcat Text " ")
); end setq
); end condition #3
((wcmatch
(strcase
(substr Mtext 1 2)) "\\[LOP]")
(setq Mtext(substr Mtext 3))
); end condition #4
((wcmatch
(strcase
(substr Mtext 1 2)) "\\[ACFHQTW]")
(setq Mtext
(substr Mtext
(+ 2(vl-string-search ";" Mtext))))
); end condition #5
((wcmatch
(strcase (substr Mtext 1 2)) "\\S")
(setq Str(substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
Text(strcat Text (vl-string-translate "#^\\" " " Str))
Mtext(substr Mtext (+ 4 (strlen Str)))
); end setq
(print Str)
); end condition #6
(T(setq Text(strcat Text(substr Mtext 1 1))
Mtext (substr Mtext 2)
); end setq
); end condition #7
); end cond
); end while
Text
); end of TTC_MText_Clear


(defun TTC_Copy (/ sObj sText tType actDoc)
(if
(and
(setq sObj(car(nentsel "\nCopy text... ")))
(member(setq tType(cdr(assoc 0(entget sObj))))
'("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))
); end and
(progn
(setq actDoc(vla-get-ActiveDocument
(vlax-get-Acad-object))
sText(vla-get-TextString
(vlax-ename->vla-object sObj))
); end setq
(if(= tType "MTEXT")
(setq sText(TTC_MText_Clear sText))
); end if
); end progn
); end if
sText
); end of TTC_Copy

(defun CCT_Str_Echo(paseStr / comStr)
(if(< 20(strlen paseStr))
(setq comStr
(strcat
(substr paseStr 1 17)"..."))
(setq comStr paseStr)
); end if
(princ(strcat "\nText = \"" comStr "\""))
(princ)
); end of CCT_Str_Echo

(defun *error*(msg)
(vla-EndUndoMark
(vla-get-ActiveDocument
(vlax-get-acad-object)))
(princ "\nQuit TTC")
(princ)
); end of *error*

(if(not ttc:Mode)(setq ttc:Mode "Multiple"))
(initget "Multiple Pair-wise")
(setq oldMode ttc:Mode
ttc:Mode(getkword
(strcat "\nSpecify mode [Multiple/Pair-wise] <"ttc:Mode">: "))
conFlag T
paseStr ""
); end setq
(if(null ttc:Mode)(setq ttc:Mode oldMode))
(if(= ttc:Mode "Multiple")
(progn
(if(and(setq paseStr(TTC_Copy))conFlag)
(progn
(CCT_Str_Echo paseStr)
(while(setq conFlag(TTC_Paste paseStr))T
); end while
); end progn
); end if
); end progn
(progn
(while(and conFlag paseStr)
(setq paseStr(TTC_Copy))
(if(and paseStr conFlag)
(progn
(CCT_Str_Echo paseStr)
(setq errFlag T)
(while errFlag
(setq conFlag(TTC_Paste paseStr))
);end while
); end progn
); end if
); end while
); end progn
); end if
(vla-EndUndoMark actDoc)
(princ "\nQuit TTC")
(princ)
); end c:ttc

(princ "\nhttp:\\\\www.AsmiTools.com ")
(princ "\n Type TTC to run text to text copy tool ")

  • 1

#5 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 14 October 2009 - 02:51 PM

Bác có thể upgrade LISP trên để có thể thực hiện được liên tục các bước copy-paste mà không cần phải nhập lại lệnh, thí dụ:
1- Đánh lệnh Copy2, chọn một Text của b/v A
2- Đánh lệnh Paste2, chọn Text ở b/v B để thay thế
3- Chọn Text khác của b/v A
4. Chọn Text khác của b/v B để thay thế
5. Cứ tiếp tục như thế...
...
ESC/ENTER để exit.
Thank you.

Update theo yêu cầu của bạn.
Với lệnh Copy2 tại dòng nhắc : Chon Text de luu vao ClipBoard : bạn có thể tạm ngưng chờ lệnh Paste2 ở bản vẽ khác.
Với lệnh Paste2 tại dòng nhắc : Tiep tuc chon Text khac Yes/No :, bạn có thể tạm ngưng để chuyển qua bản vẽ khác chọn Text nguồn mới đưa vào ClipBoard. Sau đó lại tiếp tục .....
Tuy nhiên theo nhận xét của tui thì yêu cầu cũng không cải tiến đuợc bao nhiêu, so với lệnh cũ việc nhập lại lệnh tương đuơng nhấn Enter nhưng đôi khi gây phiền phức hơn.
(vl-load-com)
(defun c:copy2 (/ ent str); Copy to ClipBoard
(princ (strcat"\nGia tri ClipBoard hien hanh <<" (if (setq str (GetClipBoardText)) (Trim_Str str 15) "nil") ">> :"))
(while (setq ent (car (entsel (strcat"\nChon Text de luu vao ClipBoard :"))))
(if (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT")
(princ (strcat"\nDa luu <<" (SetClipBoardText (cdr (assoc 1 (entget ent)))) ">> vao ClipBoard." ))
(alert "Chon doi tuong khong hop le.")
)
)
(princ)
)

(defun c:paste2 (/ obj str ss); Paste from ClipBoard
(setq str (GetClipBoardText) flag T)
(while (/= flag "N")
(and
str
(princ (strcat "\nChon text de gan gia tri tu ClipBoard <<" (Trim_Str str 15) ">> :"))
(setq ss (ssget (list (cons 0 "*TEXT")) ))
)
(if ss
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(vla-put-TextString (vlax-ename->vla-object e) str) )
)
(initget "Y N")
(setq flag (getkword "Tiep tuc chon Text khac Yes/No :"))
(setq str (GetClipBoardText))
)
(if (not str)
(alert (strcat "Gia tri ClipBoard hien hanh khong phai kieu String."
"\nGoi lenh Copy2 de luu gia tri vao ClipBoard.")) )
(princ)
)

(defun Trim_Str(Str len)
(if(and Str (< len (strlen Str)))
(strcat(substr Str 1 len)"...")
Str
))
(defun SetClipBoardText (text / htmlfile result ) ; By XShrimp
(if (= 'STR (type text))
(progn
(setq htmlfile (vlax-create-object "htmlfile")
result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'SetData "Text" text ) )
(vlax-release-object htmlfile)
text
))
)
(defun GetClipBoardText( / htmlfile result ) ; By Patrick_35
(setq htmlfile (vlax-create-object "htmlfile")
result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'GetData "Text" ) )
(vlax-release-object htmlfile)
result
)

  • 1

#6 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 14 October 2009 - 03:11 PM

Giới thiệu với các bạn đọan LISP (vừa sưu tầm đuợc) lưu và lấy dữ liệu kiểu Text từ ClipBoard
Hàm SetClipBoardText By XShrimp : lưu dữ liệu kiểu Text vào ClipBoard
Hàm GetClipBoardText By Patrick_35 : lấy dữ liệu kiểu Text từ ClipBoard

Ứng dụng :
Trong CAD
- trên bản vẽ A gọi lệnh copy2 -> chọn Text nguồn,
- trên bản vẽ B, C ... gọi lệnh paste2 -> chọn các đối tựong đích >enter :bigsmile:


Có cách nào gộp 2 lệnh copy2paste2 thành một không nhỉ??? :bigsmile:

---------
  • 0

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#7 Trang72

Trang72

    biết vẽ ellipse

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

Đã gửi 18 March 2012 - 05:42 PM

Có thể copy và reaplace (thay thế) một cụm nhiều text dời rạc được không ví dụ:


Sắt
0.3
0.2
0.7
0.8
0.8

Bằng nhôm
0.2
0.6
0.6
0.7
0.9

  • 0

#8 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 15 October 2013 - 11:20 AM

Nên dùng hàm vla-get-TextString để lấy nội dung vì  trong help đối với MTEXT mã dxf 1

Text string. If the text string is less than 250 characters, all characters appear in group 1. If the text string is greater than 250 characters, the string is divided into 250-character chunks, which appear in one or more group 3 codes. If group 3 codes are used, the last group is a group 1 and has fewer than 250 characters

Nếu text string dài hơn 250 ký tự, string được chia thành từng đoạn 250 trong dxf 3, phần còn lại < 250 ký tự mới trong dxf 1

 


  • 0

#9 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 06 November 2014 - 10:40 PM

Các bác cho em hỏi.

Nếu em quét chọn 1 tập đối tượng Text chẳng hạn. Em muốn lấy tọa độ của Text, nội dung Text ( X Y Z ND) cho vào Clipboard được không ạ?

Sau khi quét chọn Text, kết thúc lệnh thì có thể paste được vào Notepad hoặc Word  hoặc Excel ...

X1 Y1 Z1 MD

X2 Y2 Z2 NHA

................

Lisp trên trình bày hơi rối tý nên em chỉnh sửa lại cho đẹp mắt

(vl-load-com)
(defun c:copy2 (/ ent str); Copy to ClipBoard
(if (and (setq ent (car (entsel (strcat"\nChon Text de luu vao ClipBoard <<" (if (setq str (GetClipBoardText)) (Trim_Str str 15) "nil") ">> :"))))
	 (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT")
    )
    (princ (strcat"\nDa luu <<" (SetClipBoardText (cdr (assoc 1 (entget ent)))) ">> vao ClipBoard." ))
    (alert "Chon doi tuong khong hop le.")
)
(princ)
)

(defun c:paste2 (/ obj str ss); Paste from ClipBoard
  (if (setq str (GetClipBoardText))
    (progn
      (princ (strcat "\nChon text de gan gia tri tu ClipBoard <<" (Trim_Str str 15) ">> :"))
      (setq ss (ssget (list (cons 0 "*TEXT")) ))
      (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
	(vla-put-TextString (vlax-ename->vla-object e) str)
      )
    )
    (alert (strcat "Gia tri ClipBoard hien hanh khong phai kieu String."
		   "\nGoi lenh Copy2 de luu gia tri vao ClipBoard."))
  )
  (princ)
)

(defun Trim_Str(Str len)
  (if (and Str (< len (strlen Str)))
      (strcat(substr Str 1 len)"...")
    Str
  )
)

(defun SetClipBoardText (text / htmlfile result ) ; By XShrimp
  (if (= 'STR (type text))
    (progn
      (setq htmlfile (vlax-create-object "htmlfile")
	    result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'SetData "Text" text )
      )
      (vlax-release-object htmlfile)
      text
    )
    )
  )

(defun GetClipBoardText( / htmlfile result ) ; By Patrick_35
  (setq htmlfile (vlax-create-object "htmlfile")
	result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'GetData "Text" )
  )
  (vlax-release-object htmlfile)
  result
)

Cảm ơn các anh, các bác nhiều


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#10 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 06 November 2014 - 10:48 PM

Đang thắc mắc là tại sao Thanhduan không xuất trực tiếp ((x1 y1 z1 ND1) (x2 y2 z2 ND2) (x3 y3 z3 ND3)...) sang mà phải thông qua Clipboard?


  • 0

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


#11 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 06 November 2014 - 10:58 PM

Đang thắc mắc là tại sao Thanhduan không xuất trực tiếp ((x1 y1 z1 ND1) (x2 y2 z2 ND2) (x3 y3 z3 ND3)...) sang mà phải thông qua Clipboard?

Dạ, em đang nghiên cứu về Copy và Paste Clipboard. Cái em nói trên chỉ là ví dụ thôi ạ. 

Em đang nghiên cứu về kiểu mảng danh sách rồi cho vào Clipboard. Không biết có ổn không? Hiii

Với cách copy Clipboard thì em đỡ phải lưu ra file rồi mới mở bác Hạ ạ.

Cảm ơn bác đã quan tâm


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#12 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 07 November 2014 - 08:06 AM

Các hàm trên chỉ nhận 1 string thôi, không nhận mảng hay list.

Bạn phải sắp xếp trước rồi mới đưa vào clipboard.


  • 0

#13 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 07 November 2014 - 09:26 AM

Em nghĩ là được. Trong Clip này em thấy họ làm dc anh ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#14 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 07 November 2014 - 09:42 AM

Em nghĩ là được. Trong Clip này em thấy họ làm dc anh ạ

Ví dụ này họ dùng VBA Automation để liên kết Acad với Excel.

 

Nhầm rồi !


Bài viết đã được chỉnh sửa nội dung bởi gia_bach: 07 November 2014 - 04:22 PM

  • 1

#15 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2014 - 09:47 AM

Em nghĩ là được. Trong Clip này em thấy họ làm dc anh ạ

 

Chào Thanhduan!

Em tạo các string nối nhau với các ký tự \t (dấu tab) và ký tự \n (xuống dòng)
\t (dấu tab) có tác dụng chia dữ liệu thành các cột trên excel
\n (xuống dòng) có tác dụng chia dữ liệu thành các hàng trên excel

 

Cái này anh quên khuấy mất, hỏi tác giả và đã thử nghiệm được rồi

Chúc em thành công!


  • 0

#16 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 07 November 2014 - 01:40 PM

Em cảm ơn anh Gia_Bach. Em chưa rõ lắm ạ.

@Tue_NV: Anh có thể cho em 1 đoạn Code hướng dẫn không ạ?


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#17 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 November 2014 - 02:45 PM

Em cảm ơn anh Gia_Bach. Em chưa rõ lắm ạ.

@Tue_NV: Anh có thể cho em 1 đoạn Code hướng dẫn không ạ?

 

1./ Có lẽ anh gia_bach đã nhầm. Đoạn video đó load file *.vlx

2./ Thanhduan thử đoạn code sau :

 

(defun SetClipBoardText (text / htmlfile result ) ; By XShrimp
  (if (= 'STR (type text))
    (progn
      (setq htmlfile (vlax-create-object "htmlfile")
        result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'SetData "Text" text )
      )
      (vlax-release-object htmlfile)
      text
    )
    )
  )
(defun c:copy2 (/ ss i ename entg str)
  (setq i -1 str "")
  (if (setq ss (ssget '((0 . "TEXT"))))
    (while (setq ename (ssname ss (setq i (1+ i))))
      (setq entg (entget ename))
      (setq str (strcat str "X = " (rtos (cadr (assoc 10 entg))) "\t"
                "Y = " (rtos (caddr (assoc 10 entg))) "\t"


            "Z = " (rtos (caddr (assoc 10 entg))) "\t"
                (cdr(assoc 1 (entget ename))) "\n"
        ))
    )
  )
  (SetClipBoardText str)
)

Cách sử dụng :

Dùng lệnh Copy2 -> Chọn Text -> Mở Excel -> Nhấn Ctrol+V


  • 2

#18 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 07 November 2014 - 03:20 PM

1./ Có lẽ anh gia_bach đã nhầm. Đoạn video đó load file *.vlx

2./ Thanhduan thử đoạn code sau :

 

(defun SetClipBoardText (text / htmlfile result ) ; By XShrimp
  (if (= 'STR (type text))
    (progn
      (setq htmlfile (vlax-create-object "htmlfile")
        result (vlax-invoke (vlax-get (vlax-get htmlfile 'ParentWindow ) 'ClipBoardData) 'SetData "Text" text )
      )
      (vlax-release-object htmlfile)
      text
    )
    )
  )
(defun c:copy2 (/ ss i ename entg str)
  (setq i -1 str "")
  (if (setq ss (ssget '((0 . "TEXT"))))
    (while (setq ename (ssname ss (setq i (1+ i))))
      (setq entg (entget ename))
      (setq str (strcat str "X = " (rtos (cadr (assoc 10 entg))) "\t"
                "Y = " (rtos (caddr (assoc 10 entg))) "\t"


            "Z = " (rtos (caddr (assoc 10 entg))) "\t"
                (cdr(assoc 1 (entget ename))) "\n"
        ))
    )
  )
  (SetClipBoardText str)
)

Cách sử dụng :

Dùng lệnh Copy2 -> Chọn Text -> Mở Excel -> Nhấn Ctrol+V

Ok. Vậy là em hiểu rồi ạ.

Cảm ơn anh Tue_NV nhiều


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn