FastFiber
Menu

Toon bijdragen

Deze sectie stelt je in staat om alle bijdragen van dit lid te bekijken. Je kunt alleen de bijdragen zien waar je op dit moment toegang toe hebt.

Toon bijdragen Menu

Berichten - Reimer

#1
Autolisp / Re: Dynamic blocks kopiëren
ma 26 05 2025, 17:44:07
Hallo Jacob,

Wanneer je mijn lisproutine geladen hebt dan kun je in Autocad het commando Copyb gebruiken. Deze kun je ook in de toolpallet gebruiken met "^C^CCopyb".
Kun je aangeven of dit wel werkt?
#2
Autolisp / Re: Dynamic blocks kopiëren
ma 19 05 2025, 13:04:33
Hallo Jacob,

Ik snap de verwarring. Het klopt dat "defun c:commando" de naam van het commando bepaald. Je kunt echter ook "defun commando2" gebruiken voor het maken van sub-commando's. Deze kun je dan binnen een andere routine weer aanroepen. Je kunt deze trouwens ook in Autocad gebruiken door (commando2) inclusief de haakjes in te voeren. Je moet er echter wel op letten dat er dan vaak parameters bij horen die je dan ook moet opgeven (commando2 parm1 parm2 etc.).
Wat Lee Mac doet is niets anders dan "LM:" toevoegen als onderdeel van de naam van zijn commando's. Het heeft niets met de programmacode te maken.

Ik heb nu dus een programma gemaakt dat heet CopyB. Deze maakt gebruik van de sub-functies van Lee Mac.
"LM:CopyBlockDefinition" vraagt om een bestaande blocknaam (blk) en nieuwe blocknaam (new)
"LM:al-effectivename" gebruik ik om de werkelijke blocknaam van een dynamic block (ent) op te vragen.

Groeten,
Reimer
#3
Autolisp / Re: Dynamic blocks kopiëren
do 15 05 2025, 20:43:06
Ik moest ook even puzzelen maar ben er denk ik uit. Lee Mac schrijft bij de uitleg dat zijn functie werkt wanneer je het volgende ingeeft: (LM:CopyBlockDefinition "OldBlock" "NewBlock")
Ik wil liever een bestaand block selecteren dan een naar intypen. Het opvragen van de naam van een dynamic block is net wat lastiger dan van een gewoon block. Gelukkig heeft Lee Mac daar al een functie voor geschreven.
Ik heb zijn functies bij elkaar gezet en zelf een stukje code bijgeschreven. Als het goed is werkt het onderstaande wanneer je Copyb start. Bij mij werkt het!

;; Copy Block Definition  -  Lee Mac
;; Duplicates a block definition, with the copied definition assigned the name provided.
;; blk - [str] name of block definition to be duplicated
;; new - [str] name to be assigned to copied block definition
;; Returns the copied VLA Block Definition Object, else nil
(defun LM:CopyBlockDefinition ( blk new / abc app dbc dbx def doc rtn vrs )
    (setq dbx
        (vl-catch-all-apply 'vla-getinterfaceobject
            (list (setq app (vlax-get-acad-object))
                (if (< (setq vrs (atoi (getvar 'acadver))) 16)
                    "objectdbx.axdbdocument" (strcat "objectdbx.axdbdocument." (itoa vrs))
                )
            )
        )
    )
    (cond
        (  (or (null dbx) (vl-catch-all-error-p dbx))
            (prompt "\nUnable to interface with ObjectDBX.")
        )
        (  (and
                (setq doc (vla-get-activedocument app)
                      abc (vla-get-blocks doc)
                      dbc (vla-get-blocks dbx)
                      def (LM:getitem abc blk)
                )
                (not (LM:getitem abc new))
            )
            (vlax-invoke doc 'copyobjects (list def) dbc)
            (vla-put-name (setq def (LM:getitem dbc  blk)) new)
            (vlax-invoke dbx 'copyobjects (list def) abc)
            (setq rtn (LM:getitem abc new))
        )
    )
    (if (= 'vla-object (type dbx))
        (vlax-release-object dbx)
    )
    rtn
)

;; VLA-Collection: Get Item  -  Lee Mac
;; Retrieves the item with index 'idx' if present in the supplied collection
;; col - [vla]    VLA Collection Object
;; idx - [str/int] Index of the item to be retrieved
(defun LM:getitem ( col idx / obj )
    (if (not (vl-catch-all-error-p (setq obj (vl-catch-all-apply 'vla-item (list col idx)))))
        obj
    )
)

;; Effective Block Name  -  Lee Mac
;; ent - [ent] Block Reference entity
(defun LM:al-effectivename ( ent / blk rep )
    (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
        (if
            (and
                (setq rep
                    (cdadr
                        (assoc -3
                            (entget
                                (cdr
                                    (assoc 330
                                        (entget
                                            (tblobjname "block" blk)
                                        )
                                    )
                                )
                              '("AcDbBlockRepBTag")
                            )
                        )
                    )
                )
                (setq rep (handent (cdr (assoc 1005 rep))))
            )
            (setq blk (cdr (assoc 2 (entget rep))))
        )
    )
    blk
)

;; Functie door Reimer om de routine van Lee Mac te laten werken.
;;
(defun c:CopyB ( / OLDBLOCK OLDNAME NEWNAME)
  (prompt "\nSelecteer een blok om te kopiëren: ")
  (setq OLDBLOCK (car (entsel)))
  (if (and OLDBLOCK (= (cdr (assoc 0 (entget OLDBLOCK))) "INSERT"))
    (progn
      (setq OLDNAME (LM:al-effectivename OLDBLOCK))
      (setq NEWNAME (strcat OLDNAME "_1"))
      (while (tblsearch "BLOCK" NEWNAME)
        (setq NEWNAME (strcat NEWNAME "_1"))
      )
      (LM:CopyBlockDefinition OLDNAME NEWNAME)
      (princ (strcat "\nBlock '" OLDNAME "' gekopieerd als '" NEWNAME "'."))
    )
    (if (not OLDBLOCK)
      (prompt " Geen object geselecteerd.")
      (prompt " Selectie is geen block.")
    )
  );_if
  (print)
)
#4
Autolisp / Re: Dynamic blocks kopiëren
ma 05 05 2025, 16:45:48
Lee-Mac heeft een waanzinnige verzameling lisp-routines. Hij heeft ook LM:CopyBlockDefinition gemaakt. Zie: https://www.lee-mac.com/copyblockdefinition.html. Volgens mij doet deze precies wat je beschrijft en moet hij ook werken voor dynamic blocks. Zeker het proberen waard lijkt me. Ik heb hem zelf nog niet gebruikt maar wel vele andere hanige lisps van Lee Mac.

Groeten,
Reimer.
#5
Sorry voor de late reactie maar dat mag zeker.

#6
AutoCAD probleem / Re: Camera lijst?
di 24 09 2024, 11:40:07
Het is mogelijk om met qselect een camera te selecteren door de juiste naam op te geven.
Ik vond het leuk om te proberen dit met een lisp-routine op te lossen.
De onderstaande lisp maakt een lijst van alle camera's in de tekening. Na selectie van een camera wordt deze in de tekening zelf geselecteerd.

(defun c:GETCAM ( / ALLCAMS CNT CAMLIST CAM CAMNAME CAMSEL)
  (setq ALLCAMS (ssget "x" (list '(0 . "CAMERA"))))                               ;selecteer alle camera's in de tekening
  (if ALLCAMS                                                                     ;als er camera's gevonden zijn ga dan door
    (progn                                                                        ;er komt een serie opdrachten
      (setq CNT 0                                                                 ;maak een teller aan
            CAMLIST '())                                                          ;maak een lege lijst aan
      (while (< CNT (sslength ALLCAMS))                                           ;zolang de teller kleiner is dan het aantal geselecteerde camera's ga dan door
        (setq CAM (ssname ALLCAMS CNT))                                           ;selecteer de camera uit de lijst op basis van de teller
        (setq CAMNAME    (vlax-get-property (vlax-ename->vla-object CAM) 'name))     ;pak de naam van de geselecteerde camera
        (setq CAMLIST (append CAMLIST (list CAMNAME)))                            ;voeg de naam toe aan de lijst
        (setq CNT (1+ CNT))                                                       ;hoog de teller op met 1 waarna WHILE opnieuw begint
      );_while
      (setq CAMSEL (LM:listbox "Kies een camera" CAMLIST 2))                      ;start een selectiebox
      (if CAMSEL                                                                  ;is er een selectie gemaakt?
        (command "pselect" (ssname ALLCAMS (car CAMSEL)) "")                      ;zo ja: selecteer de camera in de tekening
      );_if
    );_progn
    (prompt "\nGeen camera's in de tekening gevonden.")                           ;indien in het begin geen camera's zijn gevonden geef dan een melding
  );_if
  (print)
);_defun
;; Listbox funtie Lee-mac
;; https://www.lee-mac.com/listbox.html
(defun LM:listbox ( msg lst bit / dch des tmp rtn )
    (cond
        (   (not
                (and
                    (setq tmp (vl-filename-mktemp nil nil ".dcl"))
                    (setq des (open tmp "w"))
                    (write-line
                        (strcat "listbox:dialog{label=\"" msg "\";spacer;:list_box{key=\"list\";multiple_select="
                            (if (= 1 (logand 1 bit)) "true" "false") ";width=50;height=15;}spacer;ok_cancel;}"
                        )
                        des
                    )
                    (not (close des))
                    (< 0 (setq dch (load_dialog tmp)))
                    (new_dialog "listbox" dch)
                )
            )
            (prompt "\nError Loading List Box Dialog.")
        )
        (   t    
            (start_list "list")
            (foreach itm lst (add_list itm))
            (end_list)
            (setq rtn (set_tile "list" "0"))
            (action_tile "list" "(setq rtn $value)")
            (setq rtn
                (if (= 1 (start_dialog))
                    (if (= 2 (logand 2 bit))
                        (read (strcat "(" rtn ")"))
                        (mapcar '(lambda ( x ) (nth x lst)) (read (strcat "(" rtn ")")))
                    )
                )
            )
        )
    )
    (if (< 0 dch)
        (unload_dialog dch)
    )
    (if (and tmp (setq tmp (findfile tmp)))
        (vl-file-delete tmp)
    )
    rtn
)
#7
forum / Re: spam
wo 31 07 2024, 16:53:31
Dit is echt balen. Ik ontdekte vandaag dat Cadsite.be weer te bereiken is. Echt vervelend dat er zoveel spam op binnenkomt.

Reimer.
#8
Het was even puzzelen omdat ik nooit met Parametric constrains werk. Het lukt echter wel. Zie bijlage.
Je kunt ook de maat van 71 variëren in mijn voorbeeld.
Op een gegeven moment liep het echter niet goed wanneer ik de hoek wijzigde door een getal op te geven bij de properties. Wanneer ik de grips gebruik blijft het wel goed gaan.

Groeten,
Reimer.
#9
Heb je misschien SNAP MODE aan staan (F9)? Hierdoor springt je muis naar punten op een grid die je misschien niet ziet (F7).

Groeten,
Reimer.
#10
AutoCAD probleem / Re: mijn 1e macro
vr 23 12 2022, 15:58:45
De backslash staat voor één gebruikersinvoer. (hier: selecteer een object, beëindig de selectie, kies punt 1).
Als je meer objecten wilt selecteren dan moet je extra backslashes toevoegen.  Hoe het gaat met bijvoorbeeld een crossing selection weet ik zo even niet.
Dit is meteen de beperking van een macro/script. Met lisp kun je dit beter programmeren.

Reimer.
#11
AutoCAD probleem / Re: mijn 1e macro
wo 21 12 2022, 15:08:20
Citaat van: matizje op di 20 12 2022, 12:03:21
...
^C^C_.move \ _.from \\
...
Volgens mij kan dit wel maar moet je een paar dingen wijzigen.
Geen punt bij _from
Na Move wil je een object selecteren en volgens mij ook eerst een startpunt kiezen (als ik je uitleg goed heb begrepen)
^C^C_.move \\\_from \\

Zelf ben ik fan van Lisp en denk ik dat je daar meer plezier van kunt hebben wanneer je meer van dit soort dingen wilt gaan automatiseren.

Groeten,
Reimer.
#12
Bedankt voor het delen van je oplossing. Dit scheelt anderen onnodig zoeken.

Groeten Reimer.
#13
Naast DIVIDE is er ook MEAURE. Hierbij geef je een tussen afstand op.
De tip van Julien vind ik echter beter. Daarbij kun je nog achteraf wijzigen.

Groeten Reimer.
#14
Met qselect kun je objecten selecteren op basis van parameters. Dus ook alle niet gesloten polylines.
Mogelijk kun je hier iets mee.

Reimer.
#15
Er zitten nog wel objecten in tekening test.dwg die je niet met de muis kunt selecteren.
Druk eens op ctrl+A en kijk in de properties wat je allemaal ziet. Ik zie blocks, hatches en plines. De blocks lijken leeg te zijn maar zijn wel in de tekening geplaatst. De hatches en plines hebben de eigenschap 'invisible'  wanneer je LIST gebruikt. Volgens mij betekent dit dat ze verborgen zijn door een Object Isolation. Echter verandert er niet wanneer ik dat beëindig.
Citeer
Command: li LIST 60 found
                  HATCH     Layer: "0"
                            Space: Model space
                            Invisible
                   Color: 254    Linetype: "Continuous"

Je kunt dus met ctrl+A alles in je tekening selecteren en vervolgens wat je wilt behouden weer deselecteren. Daarna erase en je bent de overbodige dingen kwijt. Je kunt ook alles selecteren wat je wilt behouden en dit naar een nieuwe tekening kopieëren.

Groeten,
Reimer.
yoin