zwonko

Użytkownik forum
  • Postów

    55
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    3

Odpowiedzi opublikowane przez zwonko

  1. W dniu 26.05.2015 o 21:52, Tomasz79 napisał:

    Program tworzy pliki exe z projektów, dzięki temu można robić matryce obliczeniowe, w których nie można robić zmian w procedurach obliczeniowych.

    Super sprawa. Dzięki!

  2. w sumie to innym podejsciem ale ogarnąłem temat

    (defun C:corblk (/
                      doc
                      x
                      ATT
                      dis
                      rot
                      )
      (vl-load-com)
      (princ "\nMove selected Attributes")
      (setq doc (vla-get-activedocument (vlax-get-acad-object)))
      (vla-startundomark doc)
      (cond
        ((ssget (list (cons 0 "INSERT")))
         (setq dis (getdist "\nType in scale: "))
         (setq dis (* 3.8 dis))
         (vlax-for item (vla-get-ActiveSelectionSet doc)
           (cond
             ((= (vla-get-HasAttributes item) :vlax-true)
              (setq att (variant-value (vla-getattributes item)))
              (foreach x (safearray-value att)
                (setq rot (vla-get-rotation x))
                (vla-put-insertionpoint x
                                        (vlax-3d-point
                                          (polar (safearray-value (variant-value (vla-get-insertionpoint x))) rot  dis ) )
                   )
                )
              (vla-update item))
             ((princ "\nNo blocks in drawing"))))))
      (vla-endundomark doc)
      (princ)
      )

     

  3. Wszystko o co mi chodzi wyjaśnione jest w załączniku w DWG. 

    Próbowałem wystartować z lispa udostępnionego tutaj:

    https://www.theswamp.org/index.php?topic=19881.30    (lisp Moveatt)

    ale niestety rusza wszystko nie to co trzeba i nie wiem gdzie wskazać konkretny atrybut. CO pewnie też ważne to blok może mieć oczywiście różny obrót, ale podany wyzej lisp sobie z tym radzi.

    Proszę o pomoc...

     

    correct_opis.dwg

  4. 8 godzin temu, alf napisał:

    1. Okno managera warstw, nadpisywanie kolorów, przezroczystości etc, czyli szykowanie do wydruku. Niestety mam problem z czynnościami związanymi z nadpisywaniem własciwości warstw dla VP. Działą to tak że dla dużej ilości warstw w pliku trzeba to robić na kilka razy, nie można zaznaczyć np 1500 warstw na raz, bo ZW nie uruchamia polecenia. Wynika z tego że jednocześnie mogę zmienić parametry dla tylu warstw ile wdzę na ekranie (~400), więc zabawa z tym jest nużąca. Wolałabym zaznaczyć wszystkie warstwy i wykonać zmianę a w czasie gdy się sprawa mieli pójść zrobić np kawę, lyb zająć się innnym rysowaniem

    w wersji 2021.03.25(63304)_x64 mam ten sam problem.

  5. Po długich a ciężkich, i Twoim tłumaczeniu @perlon zajarzyłem.

    Podsumowując zamiast cudzysłowiu trzeba napisać \". Żeby odczytywał to strcat to musi być tak naprawdę "\"".  Jeszcze łącząc to np. z vl-cmdf gdzie każdy "wpisany element" musi być w cudzysłowiu, mamy na prawdę sieczkę.

    Dodam jeszcze co dopisałem, może komuś się przyda.

    (setq line (strcat "(load \"" "DeleteBlocksV1-0.lsp\"" " nil" ")" " (if " "LM:DeleteBlocks " "(" "LM:DeleteBlocks " "(" "LM:acdoc" ") " "'" "(" "\"blokA\" " "\"blok_B\" " "\"blok C\" " ")))"))
    			(write-line line scriptname)
    
    (setq line (strcat "(vl-cmdf" " " "\"-purge\"" " " "\"b\"" " " "\"" "*" "\"" " " "\"" "n" "\"" ")"))
    			(write-line line scriptname)
    		(write-line "_qsave" scriptname)

    W ten sposób, lisp delete block usuwa z rysunku bloki (ale definicja bloku zostaje). Następnie jeszcze wywołujemy purge żeby rysunek został wyczyszczony z tych bloków (z definicji).

     

    Jeszcze raz dziękuję @perlon

  6. można prosić jeszcze jakieś objaśnienie do pisania tych "write-linów". Strasznie dużo tam apostrofów i slashy. Gubię się w tym (bo nie wiem o co chodzi) a potrzebuje napisać coś w stylu:

    (load "DeleteBlocksV1-0.lsp" nil) (if LM:DeleteBlocks (LM:DeleteBlocks (LM:acdoc) '("nazwa1" "nazwa2" "nazwa3" "nazwa4" "nazwa5")))

    tak żeby skrypt usuwał bloki podpisów. Próbowałem do tego jakoś dojść ale mam problem zwłasz z nawiasami i apostrofami.

  7. to już robi robotę!! dzięki!!

    dołożyłem jeszcze parę linijek pod koniec żeby skrypt odpalał się sam:

    (defun C:LTSALLDWG ( / filename doc scriptname)
    	(setq scriptname (open "d:\\#temp\\tmp\\batch.scr" "w"))
    	(vlax-for doc (vla-get-documents (vlax-get-acad-object))
    		(progn
    			(setq filename (vla-get-FullName doc))
    			(write-line (strcat "_open \"" filename "\"") scriptname)
    			(write-line (strcat "(vl-cmdf \"" "setvar\"" " " "\"" "ltscale\"" " " "\"1\"" " " "\""  "\"" ")") scriptname)
    			(write-line (strcat "(vl-cmdf \"" "_.layer\"" " " "\"" "_freeze\"" " " "\"*podpis*,*podpisy*,*RS podpis*\"" " " "\""  "\"" ")") scriptname)
    			(write-line "_qsave" scriptname)
    		)
    	)
    	(close scriptname)
    (command "filedia" "0")
    (command "new" " ")
    (command "closeall")
    (command "script" "d:\\#temp\\tmp\\batch.scr")
    (command "filedia" "1")
        (princ)
    )

    W przyszłości musze sobie jeszcze go wyedytować, tak żeby pytał czy chce włączyć czy wyłączyć podpisy, bo niestety czesto tak jest ze trzeba wyplotować z podpisem oraz bez.

    Czy jest możliwość żeby ustawić że skryp będzie lądować w C:\Users\XXX\AppData\Local\Temp (i odpalać się z tego miejsca)? Znaczy wiem że jest z palca bo sam zmieniłem ścieżkę, ale żeby lisp był bardziej uniwersalny pasuje żeby w miejsce XXX wskakiwał aktualny użytkownik.

     

  8. Próbuje stworzyć lispa który będzie ustawiał zmienną LTSCALE na wszystkich otwartych rysunków.

    Generalnie bazując na:

    (defun c:saveall ( / )
    (vl-load-com)
     (vlax-for OpenDwgs (vla-get-documents (vlax-get-acad-object))
       (vla-save OpenDwgs)
     );; vlax-for
     (princ)
    )

    zmodyfikowałem na proste (dla gripobjlimit) i działa:

    (defun c:gripobjlimitall ( / )
    (vl-load-com)
     (vlax-for OpenDwgs (vla-get-documents (vlax-get-acad-object))
       (vla-setvariable OpenDwgs "gripobjlimit" 100)
     );; vlax-for
     (princ)
    )

    Niestety zmiana gripobjlimit na ltscale nie działa. Zmienia tylko ltscale na pierwszym rysunku. 

     

    Próbowałem też 

    (defun c:ltsallXXX2323SKACZE ( / )
      ;; lts all 1
      (vlax-for doc (vlax-get (vlax-get-acad-object) 'Documents)
    (vla-postcommand doc (strcat "setvar " "ltscale " "1 "))
    
      );vlax-for doc
      (prompt "\nComplete.")
      (princ)
    );defun

    Ten znowu skaczę, tj. trzeba pare razy kliknąć na pierwszy otwarty rysunek (jego zakładkę, tab) lub wciskać ctrl+tab, żeby program przeskoczył przez wszystkie.

    Próbowałem też inne wariacje typu:

        (vla-postcommand doc "lts 1 \n")
    	(vla-postcommand doc (strcat "setvar " "ltscale " "1 "))
    	(vl-cmdf "setvar" "ltscale" "1" "" )
    	(vla-SendCommand doc (strcat "LTSCALE" " " "1" " "))
    	(vla-SendCommand doc (strcat " " " " ))

    Generalnie zrobiłem kilkadziesiąt prób, za każdym razem albo nie działa, albo jest skaczący. Próbowałem też dodawać aktywacje rysunku, czyli "emulować" klikanie na pierwszy, ale też nie pomogło.

     

    Ktoś może wie jak to naprawić?

    Do tego potrzebowałbym lispa który zamraża (freeze) konkretne warstwy (podpis,podpisy,Rpodpisy, itd) na otwartych rysunkach. Myślałem o sendcommand, postcommand, cmdf ale nie udało mi się osiągnąć żeby nie skakały.

  9. Aktualnie znalazłem jeszcze taki, zanim @kruszynski podesłal swój kod (którego nie testowałem).

    Ten poniżej, działa na wybrane bloki, niestety nie działa na zagnieżdzone. 

    ;ColourByLayer.lsp
    (vl-load-com)
    
    (defun C:CBL ( / *error* c_doc cme c_blks ss b_name b_lst)
    
      (defun *error* ( msg )
    		(if cme (setvar 'CMDECHO cme))
    		(if (and c_doc (= 8 (logand 8 (getvar 'UNDOCTL)))) (vla-endundomark c_doc))
    		(if (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")) (princ (strcat "\nAn Error : " msg " occurred.")))
    		(princ)
    	);_end_*error*_defun
    	
    	(setq c_doc (vla-get-activedocument (vlax-get-acad-object))
    				c_blks (vla-get-blocks c_doc)
    	);_end_setq
      
      (cond ( (/= (getvar 'cmdecho) 0) (setq cme (getvar 'cmdecho)) (setvar 'cmdecho 0)))
      
    	(if (and c_doc (= 8 (logand 8 (getvar 'UNDOCTL)))) (vla-endundomark c_doc))
    	(vla-startundomark c_doc)
    
      (setq ss (ssget ":L" '((0 . "INSERT"))))
      
    	(vlax-for blk (vla-get-activeselectionset c_doc)
    		(setq b_name (vlax-get-property blk (if (vlax-property-available-p blk 'effectivename) 'effectivename 'name)))
        (cond ( (not (vl-position b_name b_lst))
                (vlax-for obj (vla-item c_blks b_name)
                  (cond ( (= (vlax-get-property obj 'objectname) "AcDbHatch") (vlax-put-property obj 'color acbylayer))
                        (t (vlax-put-property obj 'color acbylayer))
                  );end_cond
                );end_for
                (setq b_lst (cons b_name b_lst))
              )
        );end_cond
        (vla-update blk)        
      );end_for
      
    	(vla-regen c_doc acAllViewports)
    	(if (and c_doc (= 8 (logand 8 (getvar 'UNDOCTL)))) (vla-endundomark c_doc))
    	(if cme (setvar 'cmdecho cme))
      (princ)
    );_end_defun
    

     

  10. Znalazłem coś co prawie robi to co chciałem:

    (defun c:c252 ( / doc )
       (setq doc (vla-get-activedocument (vlax-get-acad-object)))
       (vlax-for blk (vla-get-blocks doc)
           (if (= :vlax-false (vla-get-isxref blk))
               (vlax-for obj blk (vl-catch-all-apply 'vla-put-color (list obj acbylayer)))
           )
       )
       (vla-regen doc acallviewports)
       (princ)
    )
    (vl-load-com) (princ)

    Z tym, że działa to na cały rysunek a chciałbym żeby działał tylko na zaznaczone bloki....

  11. W autocadzie istnieję bardzo przydatna funkcja setbylayer, która ustawia właściwości zaznaczonych elementów na "ByLayer". Co ważne działa również wewnątrz bloków. Niesety brakuje jej w ZWCAD. Szukałem jakiś lispów zastępczych nawet na tym forum, ale albo nie działają wcale, albo nie działają na bloki. Ktoś ma może lispa co może zastąpić tą funkcję?