#| ============================= Du_list_falscher_Schwerpunkt.lsp V1.2 19.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. ============================= |# (in-package :mypkg) (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" ) (Flaechen :value-type :boolean :toggle-type :wide-toggle :initial-value t :title "Flächen kopieren" ) (Ausgabeliste_ende :initial-value nil) );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 (Zaehler 0) recover-state Ausgabeliste) ;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 (if (not nur_ET) (setq Alle_Elemente (cons TEIL Alle_Elemente))) ;(setq Alle_Elemente (unique-objects Alle_Elemente)) ; alle Exemplare entfernen (setq Alle_Elemente (remove-duplicates Alle_Elemente :test 'equal :key 'sd-inq-obj-contents-sysid)) ; alle Exemplare entfernen (setq Anzahl (length Alle_Elemente)) (let (TraeTen1 TraeTen2 Abstand_SP Messvektor falscher_SP mas falsches_Moment Typ_Teil Ausgabe Benennung ) (setq recover-state (sd-set-model-checkpoint)) (dolist (a_TEIL Alle_Elemente) (setq TraeTen1 nil TraeTen2 nil Abstand_SP nil falscher_SP nil falsches_Moment nil mas nil ) (setq Zaehler (+ Zaehler 1)) (pprint (format nil "~a/~a:~a" Zaehler Anzahl (SD-INQ-OBJ-PATHNAME a_TEIL))) ;neues Teil erstellen und Schwerpunkt vergleichen (if (sd-inq-part-p a_TEIL) (progn (create_part) (if Flaechen (progn (copy_faces :FACES (ALLE_FLAECHEN_PART a_TEIL) (values) :to_part (sd-inq-curr-part) ) )(progn ;else if (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 :select_done :centroid)) (sd-call-cmds(get_vol_prop :for_part :part (sd-inq-curr-part) :select_done :centroid)) )) (setq Abstand_SP (sd-vec-length Messvektor)) (if (> Abstand_SP 0.0000001) (setq falscher_SP t) ) ;Masse von dem Teil berechnen (setq mas (sd-sys-to-user-units :mass (sd-call-cmds(get_vol_prop :for_part :tol :percent_tol 10 :part a_TEIL :select_done :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 :select_done :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 :select_done :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)) (push Ausgabe Ausgabeliste) ;;Ergebnis zur Liste hinzufügen ) );if (sd-return-to-model-checkpoint recover-state) );; let );;dolist (return-from los_gehts (nreverse Ausgabeliste)) ;(pprint los_gehts) );;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 (pprint "--------------") (sd-show-console-window) (setq Ausgabeliste_ende (los_gehts)) (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 ;(display (format nil "~{~a~%~}" (los_gehts))) (display (format nil "~{~a~%~}" Ausgabeliste_ende)) (display (format nil "=== fertig ===~%")) ;(sd-hide-console-window) );ok-action :cleanup '(progn (sd-return-to-model-checkpoint recover-state) ) );;sd-defdialog (DEFUN ALLE_FLAECHEN_PART (PART) (frame2::getres (GET_SELECTION :FOCUS_TYPE *sd-face-seltype* :allow_face_part :select :in_part PART)) );ENDE DEFUN ;Exemplare aus der Liste entfernen (defun unique-objects(objects) (setq objects (remove-duplicates objects :test 'equal :key 'sd-inq-obj-contents-sysid)) )