#| 2018-04-24 S.Dürr Das Grundgerüst für dieses Makro habe ich aus http://osd.cad.de/downloads/exemplaranzeige.lsp bzw. http://osd.cad.de/lisp_3d_17.htm Die Ergönzung für die Anzahl der Teile innerhalb und außerhalb der Behälter ist von mir mit der Idee von lix b aus http://ww3.cad.de/foren/ubb/Forum92/HTML/000903.shtml . Wenn man Exemplare ausblendet wird auf die ganze Baugruppe gezoomt, bei einer großen BG muß man dann immer wieder reinsuchen. Kannst du das "zoomen" beim Exemplare ausblenden deaktivieren. Dazu brauchst du nur die beiden Zeilen unter Kommentar ";;" setzen: ;;(uic_set_vp_direction -1.0,3.0,-1.0 (oli::sd-inq-current-vp)) ;;(fit_vp (oli::sd-inq-current-vp)) Die erste dreht dir die Objekte, die zweite zoomt sie dir auf den gesamten Bildschirm |# (in-package :examples) (use-package :oli) (sd-defdialog 'exemplare_zeigen_zaehlen :dialog-title "Exempl. zeigen + zählen" :toolbox-button t :after-initialization '(progn (sd-set-variable-status 'Exemplare_anz :enable nil) (sd-set-variable-status 'Exemplare_aus :enable nil) ) :variables '(("Besitzerangabe") (Besitzer :value-type :assembly :title "Baugr.:" :prompt-text "Besitzer-Baugruppe angeben." :initial-value nil :modifies nil :size :third :after-input (progn (setf Teil nil) (setf Baugruppe nil) (setf Anzahl nil) (sd-set-variable-status 'Exemplare_anz :enable nil) (sd-set-variable-status 'Exemplare_aus :enable nil) (setf Rootbesitzer nil) ) ) (Rootbesitzer :value-type :boolean :title "Alles auswählen" :toggle-type :wide-toggle :after-input (progn (setf Besitzer "/") ) ) ("Exemplarangabe") (Teil :selection (*sd-part-seltype*) :face-part-allowed t :show-select-menu nil :multiple-items nil :title "Teil:" :prompt-text "Teil angeben." :initial-value nil :after-input (progn (setf Auswahl "Teil") (exemplare-anzahl Teil Besitzer) (if (> Anzahl_nummer 1) (progn (sd-set-variable-status 'Exemplare_anz :enable t) (sd-set-variable-status 'Exemplare_aus :enable t) ) (progn (sd-set-variable-status 'Exemplare_anz :enable nil) (sd-set-variable-status 'Exemplare_aus :enable nil) ) ) ) ) (Baugruppe :selection (*sd-assembly-seltype*) :face-part-allowed t :show-select-menu nil :multiple-items nil :title "Baugr.:" :prompt-text "Baugruppe angeben." :initial-value nil :after-input (progn (setf Auswahl "Baugruppe") (exemplare-anzahl Baugruppe Besitzer) (if (> Anzahl_nummer 1) (progn (sd-set-variable-status 'Exemplare_anz :enable t) (sd-set-variable-status 'Exemplare_aus :enable t) ) (progn (sd-set-variable-status 'Exemplare_anz :enable nil) (sd-set-variable-status 'Exemplare_aus :enable nil) ) ) ) ) ("-") ("Abfrage - Ergebnis:") (Anzahl :value-type :display-only :title "Gesamt-Anz.:" :value-visibility-alignment :left) (Anzahl_ohne_Behaelter :value-type :display-only :title "außerh. Beh.:" :value-visibility-alignment :left) (Anzahl_in_Behaelter :value-type :display-only :title "innerh. Beh.:" :value-visibility-alignment :left) ("Ansichts-Optionen") (b_Liste_alle :value-type :boolean :title "alle" :initial-value t :size :third :toggle-type :grouped-toggle) (b_Liste_im_Behaelter :value-type :boolean :title "innerh. Beh." :toggle-type :grouped-toggle) (b_Liste_ausserhalb_Behaelter :value-type :boolean :title "außerh. Beh." :toggle-type :grouped-toggle) (Exemplare_anz :title "Exemplare einblenden" :toggle-type :wide-toggle :push-action (progn ;ermitteln welche Teile angezeigt werden sollen. (if b_Liste_alle (exemplare-anzeigen_opt_Fenster Liste_alle nil)) (if b_Liste_ausserhalb_Behaelter (exemplare-anzeigen_opt_Fenster Liste_ausserhalb_Behaelter nil)) (if b_Liste_im_Behaelter (exemplare-anzeigen_opt_Fenster Liste_im_Behaelter nil)) ) ) (Exemplare_anz_nF :title "Exempl. anz. (Fenster neu)" :toggle-type :wide-toggle :push-action (progn ;ermitteln welche Teile angezeigt werden sollen. (if b_Liste_alle (exemplare-anzeigen_opt_Fenster Liste_alle t)) (if b_Liste_ausserhalb_Behaelter (exemplare-anzeigen_opt_Fenster Liste_ausserhalb_Behaelter t)) (if b_Liste_im_Behaelter (exemplare-anzeigen_opt_Fenster Liste_im_Behaelter t)) ) ) (Exemplare_aus :title "Exemplare ausblenden" :toggle-type :wide-toggle :push-action (progn ;ermitteln welche Teile angezeigt werden sollen. (if b_Liste_alle (exemplare-ausblenden-liste Liste_alle)) (if b_Liste_ausserhalb_Behaelter (exemplare-ausblenden-liste Liste_ausserhalb_Behaelter)) (if b_Liste_im_Behaelter (exemplare-ausblenden-liste Liste_im_Behaelter)) ) ) ("-") (Gesamtanzeige :title "Alle Objekte anzeigen" :toggle-type :wide-toggle :push-action (progn (sd-call-cmds (uic_draw_all (oli::sd-inq-current-vp)) ) (uic_set_vp_direction -1.0,3.0,-1.0 (oli::sd-inq-current-vp)) (fit_vp (oli::sd-inq-current-vp)) ;;(update_screen) ) ) ;global definieren, damit die Listen beim anzeigen verfügbar sind. (Liste_alle) (Liste_ausserhalb_Behaelter) (Liste_im_Behaelter) ) :mutual-exclusion '((Teil Baugruppe) (b_Liste_alle b_Liste_ausserhalb_Behaelter b_Liste_im_Behaelter)) :local-functions '((exemplare-anzahl (Exemplar Besitzer) (progn (setq lfdnum 0) (let (System-id-name Alle_elemente Element ) (setf System-id-name (sd-inq-obj-contents-sysid Exemplar)) (setf Alle_elemente (sd-call-cmds (get_selection :focus_type (list *sd-part-seltype* *sd-assembly-seltype*) :with_stock_container ;hinzugefügt von S. Dürr, da sonst ein Fehler auftritt :check_function #'(lambda (pseudo) (if (string= System-id-name (sd-inq-obj-contents-sysid pseudo)) :ok :filter ) ) :select :recursive :in_assembly Besitzer ) :failure (display "=> Fehler beim Ermitteln der Exemplare" ) ) ) ;Teile, die im Behälter sind ermitteln und eine Liste erstellen, die nur Teile ohne Behälter-Eltern enthalten (setf Liste_ausserhalb_Behaelter (remove-if #'(lambda (x) (behaelterobjekt-pruefen x)) Alle_elemente)) ;Liste erstellen nur mit Teilen die einen Behälter als Eltern haben. (setf Liste_im_Behaelter (remove-if-not #'(lambda (x) (behaelterobjekt-pruefen x)) Alle_elemente)) ;Liste mit allen Teilen (setf Liste_alle Alle_elemente) ; global ;Exemplare zählen (setf Anzahl_nummer (list-length Alle_elemente)) (setf Anzahl_nummer_ohne_Behaelter (list-length Liste_ausserhalb_Behaelter)) (setf Anzahl (format nil "~a Stück" Anzahl_nummer)) (setf Anzahl_ohne_Behaelter (format nil "~a Stück" Anzahl_nummer_ohne_Behaelter)) (setf Anzahl_in_Behaelter (format nil "~a Stück"(- Anzahl_nummer Anzahl_nummer_ohne_Behaelter))) ) ) ) (exemplare-anzeigen_opt_Fenster (Elemente b_neues_Fenster) (progn (if b_neues_Fenster (progn (sd-call-cmds (create_vp :corner_1 (make-gpnt2d :x 188 :y 0) :corner_2 (make-gpnt2d :x 842 :y 496) ) ) (uic_set_vp_direction -1.0,3.0,-1.0 (oli::sd-inq-current-vp)) ) );if (dolist (Element Elemente) (sd-call-cmds (add_to_vp_drawlist (oli::sd-inq-current-vp) Element) :failure (progn (display "=> Kann Exemplare nicht anzeigen.") ) ) (fit_vp (oli::sd-inq-current-vp)) ) ;;(update_screen) ) ) (exemplare-ausblenden-liste (Elemente) (progn (dolist (Element Elemente);Alle_elemente) (sd-call-cmds (remove_from_vp_drawlist (oli::sd-inq-current-vp) Element) :failure (progn (display "=> Kann Exemplare nicht ausblenden.") ) ) (fit_vp (oli::sd-inq-current-vp)) ) ;;(update_screen) ) ) ;Code von lix b aus http://ww3.cad.de/foren/ubb/Forum92/HTML/000903.shtml (behaelterobjekt-pruefen (object) (let (returnwert pfad) (progn (setf returnwert nil) (setf pfad object) (loop (when (equal (sd-inq-parent-obj pfad) nil) (return) ;; Ausstieg wenn im Root oder der Kontext-BG angelangt ) (if (sd-inq-container-p pfad) (progn (setf returnwert t) (return) ;; Ausstieg wenn ein Behaelter im Pfad gefunden ) (setf pfad (sd-inq-parent-obj pfad)) ) ) returnwert ) ) ) ) :ok-action '() :cancel-action '() )