FastFiber

block insert

Gestart door NicoV, ma 31 01 2011, 09:45:05

Vorige topic - Volgende topic

NicoV

iedereen,

ik ben op zoek naar een lisp om een block vanop een bepaalde plaats op m'n computer in te voegen (zoals insert)
doormiddel van een commando.. bv HEA140 en dan voegt hij deze in..

ps nee geen toolpalette ik werk liever met klavier..

alvast bedankt!

julien

Als je een beetje zoekt in bestaande lisps denk ik dat dit vrij goed zelf samen te stellen is voor een leek.

Opdrachtnaam
filedia op 0
Insert block
kies insertion point
fildia op 1
error handling
exit

Misschien dat je best zelf eens laat zien wat je hebt er zal dan wel iemand jou verder op weg helpen.

EddyBeerke

Als je een zoekpad insteld kun je met het venster van het commando insert gelijk de naam invoeren van het block wat je wilt hebben. Acad zal eerst zoeken in de tekening zelf en daarna in da zoekpaden die ingesteld zijn.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

ludo59

Volgend programma vraagt naar de bloknaam waarna je hem kan invoegen
Als je de visual lisp editor opstart kan je de code bewaren onder in.lsp
Als je dan met appload in de contents de file laad dan heb je het commando altijd beschikbaar.
Als je vervolgens bij options file search path met add en browse de directory waar je blocks staan selecteerd dan werkt alles perfect

(defun c:in (/ blok att)
  (setq blok (getstring "\n Geef bloknaam:"))
  (setq att (getvar "attreq"))
  (setvar "attreq" 0)
  (command "insert" blok pause "1" "1" "0")
  (setvar "attreq" att)

);]

NicoV

bedankt voor de reactie!
ik ga het morgen eens proberen!
en ik hou jullie op de hoogte!

HofCAD

#5
Beste NicoV

Zowel Ludo59 als ik, gaan er vanuit dat tijdens het aanmaken van het
block 'Scale Uniformly' uitstaat.
Als 'Scale Uniformly' altijd aan staat, dat moet er een schaalfactor verdwijnen.
Indien daar geen regel in is, moet er op getest worden.

Twee alternatieven (als de 'Blocks' zitten in C:\MijnBlokken\) zijn:
(defun c:IN (/ Dir Blok Att)
 (setq Dir "C:\\MijnBlokken\\")
 (setq Blok (getstring "\n Geef bloknaam:"))
 (setq Att (getvar "ATTREQ"))
 (setvar "ATTREQ" 0)
 (command "_.INSERT" (strcat Dir Blok) pause "1" "1" "0")
 (setvar "ATTREQ" Att)
)

Of als het path gezet is in de dialoogbox van OPTIONS:
(defun c:IN (/ Blok Att)
 (setq Blok (getstring "\n Geef bloknaam:"))
 (if (or (tblsearch "BLOCK" Blok)(findfile (strcat Blok ".dwg")))
 (progn
 (setq Att (getvar "ATTREQ"))
 (setvar "ATTREQ" 0)
 (command "_.INSERT" Blok pause "1" "1" "0")
 (setvar "ATTREQ" Att)
 )
 (princ (strcat "\nHet blok " Blok " is niet gevonden."))
 )
 (princ)
)

Door het gebruik van 'findfile' kun je een nettere afwikkeling
krijgen als de tekening (block) niet gevonden wordt.
Ook kun je via 'findfile' in een specifieke map laten zoeken bijv.:
(findfile (strcat Dir Blok ".dwg"))
Eigenlijk hoort hier ook een ERROR functie bij, om Attreq terug te zetten
als men het programma tijdens het invoegen onderbreekt.

Met vriendelijke groet, HofCAD CSI.

PS ATTREQ
Type: Integer
Saved in: Registry
Initial value: 1

Controls whether INSERT uses default attribute settings during insertion of blocks.

0 Assumes the defaults for the values of all attributes

1 Turns on prompts or a dialog box for attribute values, as specified by ATTDIA


ACADcadabra

HofCAD

#6
Voor niet en wel 'Scale Uniformly':


(defun $InsBlk (msg)
 (if (and (/= msg "Function cancelled")
  (/= msg "quit / exit abort")
     )
   (princ (strcat "\nError: " msg))
 )
 (setvar "ATTREQ" ~Att)
 (princ)
)
(defun c:InsBlk (/ @UFS BlockName ~Att)
 (defun @UFS (BlockName)
   (vl-load-com)
   (vla-get-BlockScaling
     (vla-item
(vla-get-blocks
(vla-get-activedocument
  (vlax-get-acad-object)
)
)
BlockName
     )
   )
 )
(setq olderr *error* *error* $InsBlk)
(setq BlockName (getstring "\n Enter block name:"))
 (if (or (tblsearch "BLOCK" BlockName)
(findfile (strcat BlockName ".dwg"))
     )
   (progn
     (setq ~Att (getvar "ATTREQ"))
     (setvar "ATTREQ" 0)
     (command "_.INSERT" BlockName)
     (command)
     (If (= (@UFS BlockName) 1)
(command "_.INSERT" BlockName pause "1" "0")
(command "_.INSERT" BlockName pause "1" "1" "0")
     )
     (setvar "ATTREQ" ~Att)
   )
   (princ (strcat "\nFile " BlockName ".dwg is not in search path."))
 )
 (setq *error* olderr)
 (princ)
)

Inplaats van bovenstaande @UFS kan men ook gebruiken:

(defun @UFS (BlockName)
 (cdr
   (assoc 281
  (entget (cdr (assoc 330 (entget (tblobjname "BLOCK" BlockName))))
  )
   )
 )
)



Met vriendelijke groet, HofCAD CSI.
ACADcadabra