Marek-M

Użytkownik forum
  • Postów

    192
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    11

Odpowiedzi opublikowane przez Marek-M

  1. Cześć,

    Z całym szacunkiem dla Waszej pracy i tak muszę zwrócić Wam uwagę, że zapomnieliście podać źródła i autora tego LISPa.

    Niektórzy tutaj mogą tego nie wiedzieć ale jest taki Lee Mac, który narobił sporo wartościowych programów do CAD. Przytoczony tutaj program pochodzi właśnie z tamtej strony.

    Strona źródłowa powyższego LISPa: http://www.lee-mac.com/advpolyoutline.html

  2. @kojacek!! Zarąbiście prosty kod i faktycznie skuteczny. Przydałoby się jednak, żeby taki setbylayer ustawiał parametry również dla obiektów w blokach a nawet w blokach wielokrotnie zagnieżdżonych. Ten bardziej skomplikowany skrypt daje radę również z takimi blokami. Może jakaś jedna magiczna linijka kodu pozwoli Twojemu rozwiązaniu modyfikować również obiekty wewnątrz bloków?

  3. @dmatusz3, super rozwiązanie (pół skrypt pół LISP) ale działa rewelacyjnie. Nawet foldery ze spacjami nie powodują konfliktów. Tylko trzeba pamiętać o podwójnym backslashu w ścieżce. Dzięki.

    Trochę jeszcze stuningowałem kod w pliku SCR, żeby w łatwiejszy sposób dostosowywać go do innych plików DWG i ścieżki do plików podałem w oddzielnych zmiennych:

    (setq
    	template_file 	"C:\\test\\duzy_plik_testowy_template.txt"
    	output_file 	"C:\\test\\duzy_plik_testowy_extracted_blocks.txt"
    	)
    (command "_-ATTEXT" "_C" template_file output_file)

     

  4. Z SCR korzystam sobie w taki sposób, że w okienku wyboru pliku SCR mam odpalony katalog, w którym trzymam wszystkie pliki SCR jakich używam na komputerze. Domyślnie podpowiadana jest nazwa pliku SCR zgodna z nazwą pliku DWG i wtedy tylko zatwierdzam enterem wybór. W tej chwili tylko muszę pamiętać, żeby przy ZWCAD 2015+ wybrać plik z dopiskiem 2015. Na razie jest to czynność sporadyczna i chyba na razie powstrzymam się nad rozbudową skryptu, chociaż pomysł z LSP i vernum wydaje się być prostym i skutecznym patentem. Dzięki za pomysł!

  5. Właśnie zauważyłem też taką ciekawostkę, że ZWCAD 2019 dużo dłużej niż ZWCAD 2015+ generuje pliki z listą bloków przy komendzie ATTEXT. Zmodernizowałem sobie skrypty do ATTEXT o komendy:

    (setq s (getvar "DATE"))
    [...] instrukcje skryptu ATTEXT [...]
    (strcat "* Czas ekstrakcji atrybutow w programie " (getvar "VERNUM") " =  " (rtos (setq seconds (* 86400.0 (- (getvar "DATE") s))) 2 3) "s.")

    I w efekcie otrzymałem taki rezultat:

    ZWCAD 2015+

    Cytat

    12218 records exist in the extract file.
    "* Czas ekstrakcji atrybutow w programie 2015.08.15(27483) =  0.706s."

    ZWCAD 2019

    Cytat

    12218 records extracted.
    "* Czas ekstrakcji atrybutow w programie 2019.03.15(43299)_x64 =  77.587s."

    Trochę duża ta różnica, prawda.

  6. Dziękuję! Szybka i rzeczowa odpowiedź :) Oczywiście usunięcie cudzysłowów pomogło i w ZWCAD 2019 działa, nawet ze spację w ścieżce :)

    Niestety w ścieżce posiadam spację i przez nią ZWCAD 2015+ sobie nie radzi - czy jest jakieś obejście problemu spacji w ścieżce ale takie uniwersalne, żeby ZWCAD 2015+ i 2019 potrafiły sobie z tym poradzić?

    Jeśli nie jest to takie proste, to też nie jest problem - wystarczy, że zrobię sobie oddzielne pliki skryptów dla ZWCAD 2015 i dla ZWCAD 2019

  7. No i jeszcze dopowiem, że spróbowałem w ścieżkach do plików w skrypcie zamiast pojedynczych backslashy dać po dwa backslahe:

    -ATTEXT
    C
    "C:\\test\\extract_template.txt"
    "C:\\test\\extracted_blocks.txt"

    i efekt jest jeszcze gorszy 😞

    Cytat

    Command: SCR
    SCRIPT
    Command: -ATTEXT
    Enable entity selection or extract attributes as [Dxf/Cdf/Sdf/Objects] <Cdf>: C
    Template file to load: "C:\\test\\extract_template.txt"
    File not found.
    Template file to load: "C:\\test\\extracted_blocks.txt"

    Template file to load:

     

  8. Problem dotyczy ZWCAD 2019 - VERNUM = "2019.03.15(43299)_x64"

    Mam prosty skrypt, który działa m.in. na ZWCAD 2015+, uruchamiający komendę ATTEXT z parametrami pliku szablonu i wyjściowego. Dla testów działam wewnątrz katalogu C:\test\ (co by ścieżka nie była za długa i nie miała spacji i innych nietypowych znaków). Niestety, ZWCAD 2019 przy takim skrypcie wyrzuca błąd:

    Cytat

    Command: SCR
    SCRIPT
    Command: -ATTEXT
    Enable entity selection or extract attributes as [Dxf/Cdf/Sdf/Objects] <Cdf>: C
    Template file to load: "C:\test\extract_template.txt"
    Enter output file: "C:\test\extracted_blocks.txt"
    The output file could not be opened.
    Enter output file: 

    i oczekuje na podanie pliku wyjściowego. Niestety nie wiem, czy to ja coś robię źle, czy to po prostu błąd ZWCAD 2019? A może jest na to jakieś obejście?

    Spakowane pliki testowe wrzuciłem jako załącznik test.zip

    Plik ze skryptem:

    dwg_z_blokami_script.scr

    -ATTEXT
    C
    "C:\test\extract_template.txt"
    "C:\test\extracted_blocks.txt"
    

    Plik z szablonem:

    extract_template.txt

    BL:NAME C250000
    BL:LEVEL N030000
    BL:X N030004
    BL:Y N030004
    BL:Z N030004
    BL:XSCALE N030004
    BL:YSCALE N030004
    BL:ZSCALE N030004
    BL:ORIENT N012004
    BL:NUMBER N030000
    BL:HANDLE C100000
    BL:LAYER C100000
    NAME C250000
    ARTICLE C250000

     

  9. Dobra, na tym forum AutoCADa ktoś mi pomógł i poprawił kod Lee Maca i teraz robi dokładnie to co trzeba. Zostawiam tutaj kod dla potomnych (również jako plik) :) Dzięki za pomoc! Plik zawiera dodatkowy parametr, który pozwala wybrać, czy znaczniki nowych linii mają być usuwane w komórkach tabeli (domyślna opcja, to 'zachowaj nowe linie').

    (defun c:stripFormT  ( / LM:UnFormat table col row mode)
    (defun LM:UnFormat ( str mtx  / _Replace regex ) (vl-load-com)
      ;; © Lee Mac 2010
      
      (defun _Replace ( new old str )
        (vlax-put-property regex 'pattern old) (vlax-invoke regex 'replace str new)
      )
      (setq regex (vlax-get-or-create-object "VBScript.RegExp"))  
      (mapcar
        (function
          (lambda ( x ) (vlax-put-property regex (car x) (cdr x)))
        )
        (list (cons 'global actrue) (cons 'ignorecase acfalse) (cons 'multiline actrue))
      )
      
      (mapcar
        (function
          (lambda ( x ) (setq str (_Replace (car x) (cdr x) str)))
        )
       '(
          ("Đ"       . "\\\\\\\\")
          ("$1"      . "\\\\(\\\\[ACcFfHLlOopQTW])|\\\\[ACcFfHLlOopQTW][^\\\\;]*;|\\\\[ACcFfHLlOopQTW]")
          ("$1$2/$3" . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
          ("$1$2"    . "\\\\(\\\\S)|[\\\\](})|}")
          ("$1"      . "[\\\\]({)|{")
        )
      )
      (setq str
        (if mtx
          (_Replace "\\"   "Đ" str)
          (last (mapcar '(lambda (fr)
    		 (_Replace (Car fr)(cdr fr)  str))
    		 '(("\\$1$2$3" . "(\\\\[ACcFfHLlOoPpQSTW])|({)|(})")
          		   ("\\\\" . "Đ")("\\$1$2$3" . "(\\\\[ACcFfHLlOoPpQSTW])|({)|(})")(" " . "\\\\P|\\n|\\t")))
          	)
        )
      )
      (vlax-release-object regex)
      str
    )
      
     (if
       (setq table (ssget "_:S:E:L" '((0 . "ACAD_TABLE" ))))   
       (progn
         (vla-put-regeneratetablesuppressed (setq table (vlax-ename->vla-object (ssname table 0)))  :vlax-true)
         (setq row (vlax-get table 'Rows))
         (setq col (vlax-get table 'Columns))
         
         (initget "Y N")
         (setq mode (getkword "\nKeep new line format [Yes/No]: "))
         (setq mode (or (null mode)(eq "Y" mode)))
         
         (repeat row
           (setq row (1- row))
         	((lambda (n)
    	   	(repeat n
    		  (setq n (1- n))
    		  	(if (/= (setq f (vlax-invoke table 'GetText row n)) "")
    			  (progn
    				(setq unformatted (LM:UnFormat f mode))
    		  		(vlax-invoke table 'SetText row n unformatted)))
    		  			
    					   )
    		  		)
    					  col
    					)
           )
         (vla-put-regeneratetablesuppressed table :vlax-false)
         )
       )
      (princ)
      )
    

     

    stripFormT-usun_formatowanie_tekstu_w_tabeli.lsp

  10. Dzięki,

    Zauważyłem, że chyba źle to miałem wpisane w pierwszym poście - tekst w tabeli posiada klamrę zamykającą tylko jeśli w środku pojawia się jakieś specjalne formatowanie np. pogrubienie i pokolorowanie - przykład poniżej:

    (1 . "{\\fCalibri|b0|i0|c1|p0;Simple text 1\n\\fCalibri|b1|i0|c1|p0;\\C3;\nSimple text 2\\fCalibri|b0|i0|c1|p0;\\C0;\n\nSimple text 3}")

    image.png.053cf2de464ef0f46353fa792bcbb347.png

    Jeśli tekst nie zawiera formatowania w środku, to nie ma klamry zamykającej:

    (1 . "{\\fCalibri|b0|i0;Simple text 1\n\nSimple text 2\n\nSimple text 3")

    image.png.4d40654f7912cc7c91d716cfc99776b7.png

     

    Nowy plik DWG ze zmienionym formatowaniem jak na obrazkach powyżej: Table_remove_formating_CAD.dwg

  11. Cześć,

    Po imporcie tabeli z Excela posiada ona formatowanie tekstu, które chciałbym usunąć. Z tego co zauważyłem, to jest ono zapisywane w formacie

    {\fCalibri|b0|i0|c1|p0;Jakiś tekst}

    Chciałbym móc oczyszczać tabele z formatowania aby tekst w tabeli po oczyszczeniu wyglądał tak:

    Jakiś tekst

    Znalazłem skrypt Lee Maca ale nie rozwiązuje on moich problemów. Może to być kwestia jakiegoś regexa do skonfigurowania, ale na tym się nie znam za bardzo. Może ktoś da radę prześledzić kod i zrobić jakąś poprawkę, żeby skrypt oczyszczał tekst w tabelach? Poniżej kod (również w stripFormT-usun_formatowanie_tekstu_w_tabeli.lsp), który znalazłem na forum https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/remove-character-formatting-from-tables/m-p/7988214#M368495

    (defun c:stripFormT  ( / LM:UnFormat table col row)
    (defun LM:UnFormat ( str mtx / _Replace regex ) (vl-load-com)
      ;; © Lee Mac 2010
      
      (defun _Replace ( new old str )
        (vlax-put-property regex 'pattern old) (vlax-invoke regex 'replace str new)
      )
      (setq regex (vlax-get-or-create-object "VBScript.RegExp"))  
      (mapcar
        (function
          (lambda ( x ) (vlax-put-property regex (car x) (cdr x)))
        )
        (list (cons 'global actrue) (cons 'ignorecase acfalse) (cons 'multiline actrue))
      )
      (mapcar
        (function
          (lambda ( x ) (setq str (_Replace (car x) (cdr x) str)))
        )
       '(
          ("Ð"       . "\\\\\\\\")
          (" "       . "\\\\P|\\n|\\t")
          ("$1"      . "\\\\(\\\\[ACcFfHLlOopQTW])|\\\\[ACcFfHLlOopQTW][^\\\\;]*;|\\\\[ACcFfHLlOopQTW]")
          ("$1$2/$3" . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
          ("$1$2"    . "\\\\(\\\\S)|[\\\\](})|}")
          ("$1"      . "[\\\\]({)|{")
        )
      )
      (setq str
        (if mtx
          (_Replace "\\\\" "Ð" (_Replace "\\$1$2$3" "(\\\\[ACcFfHLlOoPpQSTW])|({)|(})" str))
          (_Replace "\\"   "Ð" str)
        )
      )
      (vlax-release-object regex)
      str
    )
      
     (if
       (setq table (ssget "_:S:E:L" '((0 . "ACAD_TABLE" ))))
       (progn
         (vla-put-regeneratetablesuppressed (setq table (vlax-ename->vla-object (ssname table 0)))  :vlax-true)
         (setq row (1- (vlax-get table 'Rows)))
         (setq col (vlax-get table 'Columns))
         
         (repeat row
         	((lambda (n)
    	   	(repeat n
    		  (setq n (1- n))
    		  	(if (/= (setq f (vlax-invoke table 'GetText row n)) "")
    			  (progn
    				(setq unformatted (LM:UnFormat f nil))
    		  		(vlax-invoke table 'SetText row n unformatted)))
    		  			
    					   )
    		  		)
    					  col
    					)
    	   (setq row (1- row))
           )
         (vla-put-regeneratetablesuppressed table :vlax-false)
         )
       )
      (princ)
      
      )

     

  12. 16 godzin temu, BKW napisał:

    4. BRAK SORTOWANIA (lista rozwijana warstw, bloków) - na zrzucie pokazuje listę rozwijaną wyboru strzałki w stylu wymiarowym. Lista nie jest posortowana alfabetycznie, ale (mam wrażenie), że bloki układają się wg "daty" dodania do zbioru rysunku. Zauważyłem to, gdy skopiowany przed chwilą blok, który powinien znaleźć się na tej liście mniej więcej w środku, wylądował na samym końcu.
    W poprzedniej wersji programu podobne zjawisko zauważyłem przy liście rozwijanej warstw.

    Nie wiem jak to jest z listą bloków ale jeśli chodzi o warstwy, to brak sortowania się pojawia, gdy ilość warstw przekroczy wartość zmiennej MAXSORT (domyślnie jest ustawiona chyba na 2000).  Może to też wpływa na sortowanie listy bloków?