CADsite forum

AutoCAD => Autolisp => Topic gestart door: Reimer op ma 11 09 2017, 10:20:48

Titel: Wblock als copy paste alternatief
Bericht door: Reimer op ma 11 09 2017, 10:20:48
Ik maak veel gebruik van ctrl+c en ctrl+v. Nu merk ik dat dat op ons systeem steeds trager werkt, vooral bij het plakken. Ik heb ook wel eens gelezen dat iemand dacht dat er eerder errors in je dwg ontstaan wanneer je via het klembord van Windows kopieert. Daarom probeer ik een lisp te maken om via Wblock te kopiëren en plakken. Hieronder mijn eerste opzet.
Ik ben benieuwd wat anderen hier van vinden. Of iemand grote risico's ziet, of liever nog verbeteringen!

Voor het plakken (P00) ben ik vooral aan het zoeken naar een methode waarbij het wblock geëxplodeerd in de tekening komt (ook als deze op een gelockte laag ingevoegd wordt) en waarna de blockdefinitie weer verwijderd wordt. Purge werkt dan weer erg langzaam, vandaar dat ik een stukje visual-lisp van internet heb gebruikt.

(defun c:c00 ( / OLDECHO SS)
  (setq OLDECHO (getvar 'cmdecho))
  (setvar 'cmdecho 0)
;select objects:
  (or
    (setq SS (ssget ":L-i"));add preselected objects (exclude locked layers)
    (setq SS (ssget "_:L"));select objects (exclude locked layers)
  );_or
  (command);deselect SS
;check file and folder, execute wblock:
  (if SS
    (if (findfile "c:\\temp")
      (progn
        (command "_.ucs" "w")
        (if (findfile "c:\\temp\\cpblock.dwg")
          (command "_.wblock" "c:\\temp\\cpblock.dwg" "y" "" '(0 0) SS "");folder is found, block overwritten
          (command "_.wblock" "c:\\temp\\cpblock.dwg" "" '(0 0) SS "");forder is found, block created
        );_if blk exists
        (command "_.ucs" "p")
      );_progn
      (prompt "\De ingestelde map (c:\\temp) is niet gevonden! -EINDE-")
    );_if dir exists
    (prompt "\Geen objecten geselecteerd! -EINDE-")
  );_if SS
  (command "_.oops")
  (prompt "\nCOPY00, objecten zijn gekopieerd naar c:\\temp\cpblock.dwg. Gebruik P00 om te plakken.")
  (setvar 'cmdecho OLDECHO)
  (print)
);_defun


(defun c:p00 ( / OLDECHO BLK)
  (if (not (tblsearch "BLOCK" "cpblock"))
    (if (findfile "c:\\temp\\cpblock.dwg")
      (progn
        (setq OLDECHO (getvar 'cmdecho))
        (setvar 'cmdecho 0)
        (command "-insert" "c:\\temp\\cpblock.dwg")
        (command)
        (setvar 'insname "*cpblock")
        (command "ucs" "w")
        (command "-insert" "" '(0 0) "1" "0")
        (command "ucs" "p")
        (vl-load-com)
        (and (setq blk (tblobjname "block" "cpblock"))
          (vla-delete (vlax-ename->vla-object (cdr (assoc 330 (entget blk)))))
        );_and
        (setvar 'cmdecho OLDECHO)
        (prompt "P00 is gereed")
      );_progn
      (prompt "\nHet kopiebestand c:\\temp\\cpblock.dwg is niet gevonden. -EINDE-")
    );_if c:\\temp\\cpblock
    (prompt "\nHet block CPBLOCK bestaat al in de tekening. Verwijder deze eerst! -EINDE-")
  );_if cpblock
  (print)
);_defun


Groeten,
Reimer

Titel: Re: Wblock als copy paste alternatief
Bericht door: gery op ma 11 09 2017, 12:11:40
Ik heb net uw code getest en deze is op mijn PC niet sneller dan de standaard ctrl-c/ctrl-p. Ik zal vanavond de code in detail bestuderen.

Ikzelf gebruik voor het kopiëren en plakken via clipboard en met base point 0,0,0 volgende LISP code (via 2 tool buttons):
(defun c:ClipBaseCopy ( / #ss #ssLength )

  (if (not (setq #ss (ssget "_I"))) (setq #ss (ssget)))
 
  (setq #ssLength (sslength #ss))

  (command "_.copybase" "0,0,0" #ss "")

  (princ "\n")
                         (princ #ssLength)
  (cond ((= #ssLength 1) (princ " entity is")))
  (cond ((> #ssLength 1) (princ " entities are")))
                         (princ " copied to the clipboard with base point 0,0,0")
  (princ)

)



(defun c:ClipBasePaste ( / )
  (command "_.pasteclip" "0,0,0")
  (princ "\nClipboard contents is pasted to base point 0,0,0")
  (princ)
)


Met deze codes heb ik nog nooit problemen gehad.
Titel: Re: Wblock als copy paste alternatief
Bericht door: EddyBeerke op ma 11 09 2017, 13:32:04
Uit de help:
Citaat van: AutodeskYou can control block insertion behavior using the following methods:

Inserting exploded blocks: Preceding the name of the block with an asterisk (*) explodes the block and inserts the individual parts of it. The block definition is not added to the drawing.
Dus een "*" voor het blockmaan zorgd ervoor dat het block geexplodeerd in de tekening komt zonder block definitie.
Titel: Re: Wblock als copy paste alternatief
Bericht door: roy_043 op ma 11 09 2017, 14:00:42
Vervolgend op het commentaar van Eddy (let op "_non"):
(command "_.-insert" "*cpblock=C:\\temp\\cpblock.dwg" "_non" '(0 0 0) 1 0)

Overigens is het beter om te proberen het copy-paste probleem eerst op te lossen alvorens een work-around te verzinnen.
Titel: Re: Wblock als copy paste alternatief
Bericht door: gery op ma 11 09 2017, 14:02:05
Citaat van: Reimer op ma 11 09 2017, 10:20:48Voor het plakken (P00) ben ik vooral aan het zoeken naar een methode waarbij het wblock geëxplodeerd in de tekening komt (ook als deze op een gelockte laag ingevoegd wordt) en waarna de blockdefinitie weer verwijderd wordt.
Hier geeft u zelf het antwoord: https://www.cadsite.be/smf/index.php?topic=6643.msg35126#msg35126, ik weet wel niet of dit ook op een gelockte laag lukt.
Titel: Re: Wblock als copy paste alternatief
Bericht door: Reimer op ma 11 09 2017, 22:55:52
Bedankt voor jullie reacties allemaal. We werken sinds kort met al onze software vanaf de server (deze is vakkundig afgeschermd). De ICT-afdeling doet zijn best om alle problemen op te lossen maar ik ben bang dat dit nog lang kan gaan duren.  :roll:

Ik heb de code van Roy getest maar krijg een foutmelding:
(command "_.-insert" "*cpblock=C:\\temp\\cpblock.dwg" "_non" '(0 0 0) 1 0)
_.-insert Enter block name or [?]: *cpblock=C:\\temp\\cpblock.dwg
** Error: You may not explode blocks using the
"block name=file name" syntax.


Wat wel werkt is:
(command "_.-insert" "*C:\\temp\\cpblock.dwg" "_non" '(0 0 0) 1 0)

Ik hoef nu ook de visual lisp code niet meer te gebruiken.  :vreegoe:

Nogmaals bedankt!

Reimer
Titel: Re: Wblock als copy paste alternatief
Bericht door: roy_043 op di 12 09 2017, 09:48:39
@Reimer:
BricsCAD accepteert beide varianten en AutoCAD dus alleen de laatste:
(command "_.-insert" "*cpblock=C:\\temp\\cpblock.dwg" "_non" '(0 0 0) 1 0)
(command "_.-insert" "*C:\\temp\\cpblock.dwg" "_non" '(0 0 0) 1 0)
Titel: Re: Wblock als copy paste alternatief
Bericht door: cadtools@gmail.com op zo 17 09 2017, 21:38:02
Misschien 'Superclip' eens proberen.
Je kunt er ook een netwerk versie van maken zodat het als clipboard werkt tussen collega's.
Werkt best handig.

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/superclip-revision/td-p/2942752
Titel: Re: Wblock als copy paste alternatief
Bericht door: Reimer op ma 18 09 2017, 08:15:52
Leuk om te zien. Het principe is hetzelfde als bij mij. Helaas loopt Superclip wel vast wanneer je Paste (Insert) terwijl de actieve laag gelocked is. De dialoogbox is wel handig omdat je met de toetsen makkelijk kunt kiezen tussen de opties.
Bedankt voor het delen!

Reimer
Titel: Re: Wblock als copy paste alternatief
Bericht door: cadtools@gmail.com op di 19 09 2017, 22:42:50
En als ander alternatief.. : RLXpaste van Neerlandse bodem.

http://www.cadtutor.net/forum/showthread.php?95094-RlxPaste