;;--------------------------------------------------------------------------* ;; 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 Trennzeichen Punkt/Komma ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (in-package :custom) (use-package :oli) (sd-defdialog 'exemplare_suchen :dialog-title "Exemplare in Baugruppe" :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 ) ("Option") (Trennz_dez :value-type :boolean :toggle-type :wide-toggle :title "Trennzeichen Punkt" :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 nil ) (outfile :initial-value "c:\\Temp\\Stueckliste.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_einzelteil tester_objekt modellnummer teile_dichte teile_aufloesung teile_gewicht teile_volumen ids c-sys-id) (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) (loop for tester_objekt in nummern_liste do (when (and (sd-inq-part-p tester_objekt) (sd-inq-part-density tester_objekt :instance) (not (sd-num-equal-p (sd-sys-to-user-units :density (sd-inq-part-density tester_objekt :contents)) (sd-sys-to-user-units :density (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 loop ) ;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) (setq liste_exemplar (cons (list (sd-inq-obj-contents-name a-item) a-item) liste_exemplar) ) ;end setq liste_exemplar ) ) ;; end dolist ;;; Liste sortiere ;;; (setq liste_exemplar (sort liste_exemplar #'string-lessp :key #'car)) ;;; 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 dichte_anz (format out "~aDichte [kg/dm³]" #\TAB)) (when volumen_anz (format out "~aVolumen [dm³]" #\TAB)) (when gewicht_anz (format out "~aGewicht [kg]" #\TAB)) (when aufloesung_anz (format out "~aAuflösung" #\TAB)) (format out "~%") ;;; Einzelteile der liste_exemplar abarbeiten ;;; (loop for tester_exemplar in liste_exemplar do (when (or (and (not (sd-inq-container-p (second tester_exemplar))) (sd-inq-assembly-p (second tester_exemplar))) (sd-inq-part-p (second tester_exemplar))) ;;; 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 zählen der Exemplare zählen ;;; (setq Teile_anz 0) (loop for tester_einzelteil in nummern_liste do (when (equal (sd-inq-obj-contents-sysid (second tester_exemplar)) (sd-inq-obj-contents-sysid tester_einzelteil)) (setq Teile_anz (+ Teile_anz 1)) ) ) ;end loop ;;; Eigenschaften Dichte, Volumen, Gewicht ;;; (if (and (sd-inq-part-p (second tester_exemplar)) (or dichte_anz volumen_anz gewicht_anz)) (progn ;; Dichte ;;; (setq teile_dichte (sd-sys-to-user-units :density (sd-inq-part-density (second tester_exemplar) :contents))) ;Basisdichte ;;; 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)))) (setq teile_aufloesung "-") ) ;;; 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_anz) (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)) (when aufloesung_anz (format out "~a~a" #\TAB teile_aufloesung)) (format out "~%") ) ;end when ) ;end loop ) ;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