Rekomendowane odpowiedzi

Opublikowano

PUBLISH to nie jest to czego szukam, dlatego że:
- trzeba za każdym razem wybierać katalog
- usuwać z listy plików niepotrzebne layouty, model

AUTOPUBLISH działa jakby "automatycznie".

Opublikowano

Można po zdefiniowaniu publikacji zapisać listy arkuszy w plikach .DSD i kiedy to będzie potrzebne,

otwierać wskazany, uprzednio zdefiniowany zestaw:

2026-09-1107_36_48-ZWCAD2026Wersjaprofesjonalna-C__Users_aklaczek_Desktop_CADprofiElectrical.png.4f079ef75058ef73a820d2247732e0cb.png

 

Zgłoszę do producenta Pana wniosek o rozwiązanie analogiczne do wspomnianego AUTOPUBLISH

  • 1 miesiąc temu...
Opublikowano (edytowane)
;;; ============================================================
;;; AUTOPUBLISH.LSP - ZWCAD 2026 STABLE VERSION
;;; ============================================================

(vl-load-com)

(defun AP:ErrorHandler (msg)
  (if (and (boundp '*AP-oldFileDia*) *AP-oldFileDia*) (setvar "FILEDIA" *AP-oldFileDia*))
  (if (and (boundp '*AP-oldBackgroundPlot*) *AP-oldBackgroundPlot*) (setvar "BACKGROUNDPLOT" *AP-oldBackgroundPlot*))
  (if (and (boundp '*AP-oldCmdEcho*) *AP-oldCmdEcho*) (setvar "CMDECHO" *AP-oldCmdEcho*))
  (if (and (boundp '*AP-dsdFile*) *AP-dsdFile* (findfile *AP-dsdFile*)) (vl-file-delete *AP-dsdFile*))
  (if (and msg (/= msg "Function cancelled") (/= msg "quit / exit abort"))
    (princ (strcat "\nBLAD: " msg))
  )
  (princ)
)

(defun AP:GetLayouts (/ doc layouts lay tmp)
  (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  (setq layouts (vla-get-Layouts doc))
  (setq tmp '())
  (vlax-for lay layouts
    (if (/= (strcase (vla-get-Name lay)) "MODEL")
      (setq tmp (cons (list (vla-get-TabOrder lay) (vla-get-Name lay)) tmp))
    )
  )
  (setq tmp (vl-sort tmp '(lambda (a b) (< (car a) (car b)))))
  (mapcar 'cadr tmp)
)

(defun AP:MakeDSD (dsd dwg pdf layouts / f lay i sheetname outdir)
  (setq f (open dsd "w"))
  (write-line "[DWF6Version]" f)
  (write-line "Ver=1" f)
  (write-line "[DWF6MinorVersion]" f)
  (write-line "MinorVer=1" f)
  (setq i 1)
  (foreach lay layouts
    (setq sheetname (strcat (vl-filename-base dwg) "-" lay))
    (write-line (strcat "[DWF6Sheet:" sheetname "]") f)
    (write-line (strcat "DWG=" dwg) f)
    (write-line (strcat "Layout=" lay) f)
    (write-line "Setup=" f)
    (write-line (strcat "OriginalSheetPath=" dwg) f)
    (write-line "Has Plot Port=0" f)
    (write-line "Has3DDWF=0" f)
    (setq i (1+ i))
  )
  (write-line "[Target]" f)
  (write-line "Type=6" f)
  (write-line (strcat "DWF=" pdf) f)
  (setq outdir (vl-filename-directory pdf))
  (write-line (strcat "OUT=" outdir "/") f)
  (write-line "PWD=" f)
  (write-line "[AutoCAD Block Data]" f)
  (write-line "IncludeBlockInfo=0" f)
  (write-line "BlockTmplFilePath=" f)
  (write-line "[SheetSet Properties]" f)
  (write-line "IsSheetSet=FALSE" f)
  (write-line "IsHomogeneous=FALSE" f)
  (write-line "SheetSet Name=" f)
  (write-line "NoOfCopies=1" f)
  (write-line "PlotStampOn=FALSE" f)
  (write-line "ViewFile=FALSE" f)
  (write-line "JobID=0" f)
  (write-line "SelectionSetName=" f)
  (write-line "AcadProfile=" f)
  (write-line "CategoryName=" f)
  (write-line (strcat "LogFilePath=" outdir "/AUTOPUBLISH.log") f)
  (write-line "IncludeLayer=TRUE" f)
  (write-line "LineMerge=FALSE" f)
  (write-line "CurrentPrecision=" f)
  (write-line "PromptForDwfName=FALSE" f)
  (write-line "PwdProtectPublishedDWF=FALSE" f)
  (write-line "PromptForPwd=FALSE" f)
  (write-line "RepublishingMarkups=FALSE" f)
  (write-line "PublishSheetSetMetadata=FALSE" f)
  (write-line "PublishSheetMetadata=FALSE" f)
  (write-line "3DDWFOptions=0 0" f)
  (close f)
  T
)

(defun AP:PDFValid (file / f line size)
  ;; Sprawdza, czy plik istnieje, ma rozmiar > 0 i naglowek PDF.
  (setq size (vl-file-size file))
  (if (and size (> size 0) (setq f (open file "r")))
    (progn
      (setq line (read-line f))
      (close f)
      (and line (wcmatch line "%PDF-*"))
    )
    nil
  )
)

(defun AP:RunPublish (dwgFile pdfFile layouts /)
  (if (findfile *AP-dsdFile*)
    (vl-file-delete *AP-dsdFile*)
  )
  (if (not (AP:MakeDSD *AP-dsdFile* dwgFile pdfFile layouts))
    (princ "\nBLAD: Nie udalo sie przygotowac pliku DSD.")
    (progn
      (setvar "FILEDIA" 0)
      (setvar "BACKGROUNDPLOT" 0)
      (setvar "CMDECHO" 0)
      (princ "\nPublikowanie PDF... Prosze czekac...")
      (command "_.-PUBLISH" *AP-dsdFile* "")
      ;; Przywracanie ustawien po publikacji
      (setvar "FILEDIA" *AP-oldFileDia*)
      (setvar "BACKGROUNDPLOT" *AP-oldBackgroundPlot*)
      (setvar "CMDECHO" *AP-oldCmdEcho*)
      (vl-cmdf "_.DELAY" 2000)
      ;; PDF jest nowy (stary usunieto) i musi miec poprawny naglowek.
      (if (AP:PDFValid pdfFile)
        (progn
          (princ "\n====================================")
          (princ (strcat "\nSciezka: " pdfFile))
          (princ "\n=== PDF UTWORZONY POMYSLNIE! ===")
        )
        (progn
          (princ "\n====================================")
          (princ "\n=== PDF NIE ZOSTAL UTWORZONY LUB JEST USZKODZONY. ===")
        )
      )
    )
  )
)

(defun c:AUTOPUBLISH (/ old-err dwgPrefix dwgName dwgFile pdfFile layouts)
  (setq old-err *error*
        *error* AP:ErrorHandler)
  (setq *AP-oldFileDia* (getvar "FILEDIA")
        *AP-oldBackgroundPlot* (getvar "BACKGROUNDPLOT")
        *AP-oldCmdEcho* (getvar "CMDECHO"))
  (setq dwgPrefix (getvar "DWGPREFIX")
        dwgName (getvar "DWGNAME"))
  (if (or (= dwgPrefix "") (= dwgName ""))
    (princ "\nRysunek nie jest zapisany. Najpierw zapisz DWG.")
    (progn
      (setq dwgFile (strcat dwgPrefix dwgName))
      (setq pdfFile (strcat dwgPrefix (vl-filename-base dwgName) ".pdf"))
      (setq *AP-dsdFile* (strcat dwgPrefix "~AUTOPUBLISH.dsd"))
      (setq layouts (AP:GetLayouts))
      (if (= layouts nil)
        (princ "\nBrak Layoutow.")
        (progn
          (princ "\n====================================")
          (princ "\n=== AUTOPUBLISH ZWCAD 2026 ===")
          (princ "\n====================================")
          ;; Najpierw usun stary PDF. Jesli nadal istnieje, BEZWZGLEDNIE przerwij.
          (if (findfile pdfFile)
            (vl-file-delete pdfFile)
          )
          (if (findfile pdfFile)
            (progn
              (princ "\n====================================")
              (princ "\nBLAD: Nie mozna usunac istniejącego PDF.")
              (princ "\nPlik jest prawdopodobnie otwarty lub zablokowany.")
              (princ "\nZamknij PDF w Adobe Reader i uruchom AUTOPUBLISH ponownie.")
			  (princ "\n=== ERROR === PDF NIE ZOSTAL UTWORZONY LUB JEST USZKODZONY. ===")
            )
            ;; Publikacja i komunikat wyniku tylko w AP:RunPublish.
            (AP:RunPublish dwgFile pdfFile layouts)
          )
          (if (findfile *AP-dsdFile*)
            (vl-file-delete *AP-dsdFile*)
          )
        )
      )
    )
  )
  (setq *error* old-err)
  (princ)
)

;; Pusta linia ponizej chroni plik przed bledem EOF na koncu strumienia danych LISP

 

AUTOPUBLISH.lsp

Edytowane przez simbamat
Opublikowano

Nie ładowałem tego, i nie sprawdzałem czy działa dobrze... pobieżnie przeglądając kod, jedna uwaga: dlaczego AI się tak tutaj "zmóźdża"? : image.png.b376d5bdb24aeb20f2d810734f10d718.png 

czy nie wystarczy wywołać:

(layoutlist)

?

Opublikowano

Polecenie (layoutlist) generuje listę arkuszy w kolejności tworzenia, jeśli dobrze rozumiem.

Jeśli zmienimy kolejność, to (layoutlist) nie będzie o tym wiedział.

Natomiast powyższa funkcja AP:GetLayouts chyba wyświetla listę arkuszy w rzeczywistej kolejności.

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie