;;--------------------------------------------------------------------------* ;; Modulbeschreibung: ;; Erstelle eine Liste der Exemplare aus einer gewählten Baugruppe ;;--------------------------------------------------------------------------* ;; Dateiname: exemplare_suchen.lsp ;; Version : 1.0 ;; Datum : 09.03.2018 ;; Author : MiBr ;;--------------------------------------------------------------------------* ;; Version : 2.0 ;; Datum : 16.03.2018 ;; Änderung : Suche nach Objekten anstelle von Modellnummern ;; Eigenschaften Dichte, Gewicht ... hinzugefügt ;; Unterstiche werden duch Leerzeichen ersetzt ;; Auswahl Dezimaltrennzeichen Punkt/Komma ;;--------------------------------------------------------------------------* ;; Version : 2.1 ;; Datum : 20.03.2018 ;; Änderung : Liste nach Teile und Baugruppen sortieren hinzugefügt ;; Modell-Nr. mit Punkt nach vorne sortieren ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (in-package :custom) (use-package :oli) (sd-defdialog 'stueckliste_erstellen :dialog-title "Stückliste erstellen" :toolbox-button t :variables '( (quelle_bg :modifies nil :initial-value nil :value-type :assembly :prompt-text "Baugruppe angeben" :title "Baugruppe" ) ("Zusätzlich Anzeigen") (dichte_anz :value-type :boolean :toggle-type :grouped-toggle :title "Dichte" :persistent-data-storage t :initial-value t ) (volumen_anz :value-type :boolean :toggle-type :grouped-toggle :title "Volumen" :persistent-data-storage t :initial-value t ) (gewicht_anz :value-type :boolean :toggle-type :grouped-toggle :title "Gewicht" :persistent-data-storage t :initial-value t ) (aufloesung_anz :value-type :boolean :toggle-type :grouped-toggle :title "Auflösung" :persistent-data-storage t :initial-value t ) (parameters :title "Optionen" :expand-shrink (punkt_anf baugr_ende trennz_dez lade_stkl )) (punkt_anf :value-type :boolean :toggle-type :wide-toggle :title "Modell-Nr. m. Punkt n.v. sortieren" :persistent-data-storage t :initial-value t ) (baugr_ende :value-type :boolean :toggle-type :wide-toggle :title "Baugr. am Listenende einfügen" :persistent-data-storage t :initial-value nil ) (trennz_dez :value-type :boolean :toggle-type :wide-toggle :title "Punkt als Dezimaltrennzeichen" :persistent-data-storage t :initial-value nil ) (lade_stkl :value-type :boolean :toggle-type :wide-toggle :title "Stückliste laden" :persistent-data-storage t :initial-value t ) (outfile :initial-value "c:\\Temp\\Teileliste.csv" ;(format nil "~aStueckliste.csv" (sd-inq-temp-dir)) ;temp-dir verwenden ) ) ;end variables :ok-action '(do-liste) :local-functions '( (do-liste () (let (nummern_liste liste_exemplar tester_exemplar tester_objekt modellnummer teile_benennung teile_anzahl teile_dichte teile_aufloesung teile_gewicht teile_volumen a-item ids c-sys-id bg_liste punkt_liste id_nummern_liste) (setq nummern_liste (sd-inq-obj-children quelle_bg)) ;;; Meldung falls es eine Exemplardichte die Abweichen von Der Basisdichte gibt !!! (when (or dichte_anz gewicht_anz) (dolist (tester_objekt nummern_liste) (when (and (sd-inq-part-p tester_objekt) (sd-inq-part-density tester_objekt :instance) (not (sd-num-equal-p (sd-inq-part-density tester_objekt :contents) (sd-inq-part-density tester_objekt :instance)))) (display (format nil "~a ~a besitzt unterschiedliche Dichten~%-> Basis: ~,3f Exemplar: ~,3f~%" (sd-inq-obj-contents-name tester_objekt) (sd-inq-obj-basename tester_objekt) (* (sd-sys-to-user-units :density (sd-inq-part-density tester_objekt :contents)) 1000) (* (sd-sys-to-user-units :density (sd-inq-part-density tester_objekt :instance)) 1000) ) ) ) ;end when ) ;end dolist ) ;end when ;;; Liste Exemplare erstellen ;;; (dolist (a-item nummern_liste) (setq c-sys-id (sd-inq-obj-contents-sysid a-item)) (unless (find c-sys-id ids :test #'sd-string=) (push c-sys-id ids) (push (list (sd-inq-obj-contents-name a-item) a-item) liste_exemplar) ;end setq liste_exemplar ) (push (sd-inq-obj-contents-sysid a-item) id_nummern_liste) ) ;; end dolist ;;; Liste sortiere ;;; (setq liste_exemplar (sort liste_exemplar #'string-lessp :key #'car)) ;;; Modellnummern die einen Punkt enthalten -> vorne in Liste schreiben ;;; (when punkt_anf (let (point-with point-without) (dolist (a-item liste_exemplar) (if (find "." (first a-item) :test #'sd-string=) (push a-item point-with) (push a-item point-without) ) ) (setq liste_exemplar (nreverse (nconc point-without point-with))) ) ;end let ) ;;; Liste nach Teile und Baugruppen sortieren ;;; (when baugr_ende (let (item-part item-assembly) (dolist (a-item liste_exemplar) (if (sd-inq-part-p (second a-item)) (push a-item item-part) (push a-item item-assembly) ) ) (setq liste_exemplar (nreverse (nconc item-assembly item-part))) ) ;end let ) ;;; In Datei schreiben ;;; (with-open-file (out outfile :direction :output :if-exists :supersede :if-does-not-exist :create :external-format :uft-8) ;;; Überschrift der Rubriken in Datei schreiben ;;; (when (sd-inq-obj-contents-name quelle_bg) (format out "~a - " (sd-inq-obj-contents-name quelle_bg))) (format out "~a" (sd-inq-obj-basename quelle_bg)) (format out "~%~%") (format out "Modellnummer~aBezeichnung~aMenge [Stk]"#\TAB #\TAB) (when aufloesung_anz (format out "~aAuflösung" #\TAB)) (when dichte_anz (format out "~aDichte [kg/dm³]" #\TAB)) (when volumen_anz (format out "~aVolumen [dm³]" #\TAB)) (when gewicht_anz (format out "~aGewicht [kg]" #\TAB)) (format out "~%") ;;; Einzelteile der liste_exemplar abarbeiten ;;; (dolist (tester_exemplar liste_exemplar) (when (or (and (sd-inq-assembly-p (second tester_exemplar)) (not (sd-inq-container-p (second tester_exemplar)))) (sd-inq-part-p (second tester_exemplar))) ;nur Teile und Baugruppen (keine Behälter) berücksichtigen ;;; Modellnamen und bei NIL in ??? umwandeln ;;; (if (sd-inq-obj-contents-name (second tester_exemplar)) (setq modellnummer (sd-string-replace (sd-inq-obj-contents-name (second tester_exemplar)) "_" " ")) ;Unterstrich ersetzen (setq modellnummer "???")) ;;; Benennung ;;; (setq teile_benennung (sd-string-replace (sd-inq-obj-basename (second tester_exemplar)) "_" " ")) ;Unterstrich ersetzen ;;; Anzahl der Exemplare zählen ;;; (setq teile_anzahl (count (sd-inq-obj-contents-sysid (second tester_exemplar)) id_nummern_liste :test #'equal)) ;;; Eigenschaften Dichte, Volumen, Gewicht ;;; (if (and (sd-inq-part-p (second tester_exemplar)) (or dichte_anz volumen_anz gewicht_anz)) (progn ;; Dichte ;;; (if (sd-inq-part-density (second tester_exemplar) :contents) (setq teile_dichte (sd-sys-to-user-units :density (sd-inq-part-density (second tester_exemplar) :contents))) ;Basisdichte (setq teile_dichte 0.001) ) ;;; Volumen ;;; (setq teile_volumen (sd-call-cmds (get_vol_prop :for_part (second tester_exemplar) :part_asmb (sd-inq-obj-pathname (second tester_exemplar)) :volume) :failure nil )) ;;; Gewicht ;;; (setq teile_gewicht (format nil "~,3F" (* teile_volumen teile_dichte 0.001))) ;;; Dichte formatieren / Volumen formatieren;;; (setq teile_dichte (format nil "~,3F" (* teile_dichte 1000))) (setq teile_volumen (* teile_volumen 0.000001)) (setq teile_volumen (format nil "~,4F" teile_volumen)) ) ;end then (progn (setq teile_dichte "-") (setq teile_volumen "-") (setq teile_gewicht "-") ) ;end else ) ;;; Auflösung ;;; (if (and (sd-inq-part-p (second tester_exemplar)) (sd-inq-part-geo-resolution (second tester_exemplar)) aufloesung_anz) (setq teile_aufloesung (sd-num-to-string (sd-inq-part-geo-resolution (second tester_exemplar)))) ;then (setq teile_aufloesung "-") ;else ) ;;; Punkt zu Komma ;;; (unless trennz_dez (setq teile_gewicht (sd-string-replace teile_gewicht "." ",")) (setq teile_dichte (sd-string-replace teile_dichte "." ",")) (setq teile_volumen (sd-string-replace teile_volumen "." ",")) (setq teile_aufloesung (sd-string-replace teile_aufloesung "." ",")) ) ;;; In Datei schreiben ;;; (format out "~a~a~a~a~a" modellnummer #\TAB teile_benennung #\TAB teile_anzahl) (when aufloesung_anz (format out "~a~a" #\TAB teile_aufloesung)) (when dichte_anz (format out "~a~a" #\TAB teile_dichte )) (when volumen_anz (format out "~a~a" #\TAB teile_volumen)) (when gewicht_anz (format out "~a~a" #\TAB teile_gewicht)) (format out "~%") ) ;end when ) ;end dolist ) ;end with-open-file ) ;end let ;;; Teileliste in Excel öffnen ;;; (when lade_stkl (oli:sd-display-url outfile)) ) ;end do-liste ) ;end local-functions ) ;end sd-defdialog