#| ============================= Du_list_falscher_Schwerpunkt.lsp V1.1 12.05.2020 In der ausgewählten Baugruppe wird der Schwerpunkt von allen Teilen geprüft. Dazu wird ein neues Teil erstellt, das Vergleichsteil importiert und anschließend die Schwerpunkte verglichen. Normal sind sie gleich. Wenn nicht, wird der Abstand angezeigt. Außerdem wird der Massenträgheitstensor mit zwei verschiedenen Koordinatensystemen berechnet und verglichen. Der Trägheitstensor um die Achse X müsste gleich sein. Wenn nicht, wird auch diese Differenz angezeigt. Damit können leicht Modelle genfunden werden, die falsche Werte für den Schwerpunkt und die Massenträgheit hinterlegt haben. ============================= |# (use-package :OLI) (sd-defdialog 'Du_list_falscher_SP :dialog-title "Schwerpunkt/Trägheit prüfen" :toolbox-button t :variables '( (TEIL :value-type :assembly :multiple-items nil :modifies nil :title (sd-multi-lang-string "Assembly" :german "Baugruppe") :prompt-text (sd-multi-lang-string "Specify Assembly" :german "Baugruppe angeben") :initial-value nil ) (nur_ET :value-type :boolean :toggle-type :wide-toggle :initial-value nil :title "nur Einzelteile auswerten" ) (ohne_Behaelter :value-type :boolean :toggle-type :wide-toggle :initial-value t :title "ohne Behälter auswerten" ) (Alle_Ergebnisse :value-type :boolean :toggle-type :wide-toggle :initial-value nil :title "Ergebnisse aller Teile ausgeben" ) );variables :help-action '(sd-display-message (format nil "In der ausgewählten Baugruppe wird der Schwerpunkt von allen Teilen geprüft. Dazu wird ein neues Teil erstellt, das Vergleichsteil importiert und anschließend die Schwerpunkte verglichen. Normal sind sie gleich. Wenn nicht, wird der Abstand angezeigt. Außerdem wird der Massenträgheitstensor mit zwei verschiedenen Koordinatensystemen berechnet und verglichen. Der Trägheitstensor um die Achse X müsste gleich sein. Wenn nicht, wird auch diese Differenz angezeigt. Damit können leicht Modelle genfunden werden, die falsche Werte für den Schwerpunkt und die Massenträgheit hinterlegt haben.") :title "Hilfe: Schwerpunkt/Trägheit prüfen" ) :local-functions '( (los_gehts () (let (Alle_Elemente ) ;Auswahl der Teile mit/ohne BG (setq Alle_Elemente (sd-call-cmds (get_selection :focus_type (if nur_ET (list *sd-part-seltype*) (list *sd-part-seltype* *sd-assembly-seltype*)) :with_stock_container ;hinzugefügt, da sonst ein Fehler auftritt :check_function ;Teile mit Roh/Fertigteil-Beziehung aussortieren #'(lambda (si) (let () (if (or (sd-inq-stock-container-p (sd-inq-parent-obj si)) (sd-inq-stock-container-p si)) :filter :ok );;if );;let );;lambda :select :recursive :in_assembly TEIL ) :failure (display "=> Fehler beim Ermitteln der Exemplare" ) )) ;Teile, die im Behälter sind ermitteln und aus der Liste entfernen (if ohne_Behaelter (progn (setf Alle_Elemente (remove-if #'(lambda (x) (behaelterobjekt-pruefen x)) Alle_Elemente)) )) ;damit die ausgewählte BG auch geprüft wird (setq Alle_Elemente (cons TEIL Alle_Elemente)) (setq Alle_Elemente (unique-objects Alle_Elemente)) ; alle Exemplare entfernen (dolist (a_TEIL Alle_Elemente) (let (TraeTen1 TraeTen2 Abstand_SP Messvektor falscher_SP mas falsches_Moment Typ_Teil Ausgabe Benennung) (setq recover-state (sd-set-model-checkpoint)) (setq TraeTen1 nil) (setq TraeTen2 nil) (setq Abstand_SP nil) (setq falscher_SP nil) (setq falsches_Moment nil) (setq mas nil) ;(pprint (SD-INQ-OBJ-PATHNAME a_TEIL)) ;neues Teil erstellen und Schwerpunkt vergleichen (if (sd-inq-part-p a_TEIL) (progn (create_part) (unite_3d :keep_tools :YES :BLANK (sd-inq-curr-part) :TOOLS a_TEIL ) ;Abstand zwischen altem und neuem Schwerpunkt berechnen (setq Messvektor (sd-vec-subtract (sd-call-cmds(get_vol_prop :for_part :part a_TEIL :centroid)) (sd-call-cmds(get_vol_prop :for_part :part (sd-inq-curr-part) :centroid)) )) (setq Abstand_SP (sd-vec-length Messvektor)) (if (> Abstand_SP 0.0000001) (setq falscher_SP t) ) ;neues Teil löschen ;;(delete_3d (sd-inq-curr-part) ) ;Masse von dem Teil berechnen (setq mas (sd-sys-to-user-units :mass (sd-call-cmds(get_vol_prop :for_part :part a_TEIL :tol :percent_tol 10 :mass)) )) ) ) ;if ;Ende Schwerpunkt vergleichen ;Trägheitstensoren ermitteln und vergleichen (setq TraeTen1 (gpnt3d_x (first (sd-call-cmds(get_vol_prop :for_part :part_asmb a_TEIL :ref_coord :point 0,0,0 :z_axis :z :x_axis :x :apply :inertia_ref_coord))))) (setq TraeTen2 (gpnt3d_x (first (sd-call-cmds(get_vol_prop :for_part :part_asmb a_TEIL :ref_coord :point 0,0,0 :z_axis :y :x_axis :x :apply :inertia_ref_coord))))) ;(pprint (format nil "~a - ~a : ~a " TraeTen1 TraeTen2 (sd-inq-obj-basename a_TEIL))) ;Ergebnisse der Trägheitstensoren vergleichen und bewerten (if TraeTen1 (progn (if (not (sd-num-equal-p TraeTen1 TraeTen2)) (progn (setq falsches_Moment (abs (- TraeTen1 TraeTen2))) (pprint (format nil "Differenz gefunden: ~a - bei Teil: ~a" falsches_Moment (SD-INQ-OBJ-PATHNAME a_TEIL))) ) (pprint (format nil "keine Differenz gefunden bei Teil ~a" (SD-INQ-OBJ-PATHNAME a_TEIL) )) ) )(pprint "keine Momente ermittelt") ) (if (or Alle_Ergebnisse falscher_SP falsches_Moment) (progn (if (sd-inq-obj-contents-name a_TEIL) (setq Benennung (format nil "~a : ~a" (sd-inq-obj-basename a_TEIL) (sd-inq-obj-contents-name a_TEIL))) (setq Benennung (format nil "~a" (sd-inq-obj-basename a_TEIL))) ); (if Abstand_SP (setq Abstand_SP (format nil "~16,4f" Abstand_SP)) (setq Abstand_SP " - ") ) (if falsches_Moment (setq falsches_Moment (format nil "~16,4f" falsches_Moment)) (setq falsches_Moment " - ") ) (if (not mas) (setq mas 0)) (setq Typ_Teil " * ") (if (sd-inq-part-p a_TEIL) (setq Typ_Teil "ET")) (if (sd-inq-assembly-p a_TEIL) (setq Typ_Teil "BG")) (setq Ausgabe (format nil "~12,4f : ~a : ~a : ~a : ~a" mas Abstand_SP falsches_Moment Typ_Teil Benennung)) (setq Ausgabeliste (cons Ausgabe Ausgabeliste)) ) );if (sd-return-to-model-checkpoint recover-state) );; let );;dolist );;let );;losgehts ;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 ) ) ) );;local-functions :ok-action '(progn (setq Ausgabeliste nil) (pprint "--------------") (los_gehts);Teile prüfen (display " ") (display (format nil " Überprüfen Schwerpunkte und Trägheitstensoren für Baugruppe: ~a" (sd-inq-obj-basename TEIL))) (display " Masse : Diff Schwerpunkt : Diff Trägheit : Typ : Exemplarname : Modelname") (display " [kg] : [mm] : [gmm²] : : : ") (display " =================================================================================") ;Ergebnisse auflisten (dolist (Ergebnisse Ausgabeliste) (display (format nil "~a" Ergebnisse)) );dolist (display (format nil "=== fertig ===~%")) );ok-action :cleanup '(progn (sd-return-to-model-checkpoint recover-state) ) );;sd-defdialog ;Exemplare aus der Liste entfernen (defun unique-objects(objects) (setq objects (remove-duplicates objects :test 'equal :key 'sd-inq-obj-contents-sysid)) )