#| ============================= Du_list_falscher_Schwerpunkt.lsp 06.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") ) (nur_ET :value-type :boolean :toggle-type :wide-toggle :initial-value nil :title "nur Einzelteile auswerten" ) (Alle_Ergebnisse :value-type :boolean :toggle-type :wide-toggle :initial-value nil :title "Ergebnisse aller Teile ausgeben" ) );variables :local-functions '( (los_gehts () ;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" ) )) ;damit die ausgewählte BG auch geprüft wird (setq Alle_Elemente (cons TEIL Alle_Elemente)) (dolist (a_TEIL (unique-objects Alle_Elemente)) (progn (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 (sd-call-cmds(get_vol_prop :for_part a_TEIL :ref_coord :point 0,0,0 :z_axis :z :x_axis :x :apply :inertia_ref_coord) :success(progn (setq TraeTen1 (gpnt3d_x (first *SD-ACTION-RESULT*))) ) :failure(format T "TraeTen1_nix") ) (sd-call-cmds(get_vol_prop :for_part a_TEIL :ref_coord :point 0,0,0 :z_axis :y :x_axis :x :apply :inertia_ref_coord) :success(progn (setq TraeTen2 (gpnt3d_x (first *SD-ACTION-RESULT*))) ) :failure(format T "TraeTen2_nix2") ) ;(pprint (format nil "~a - ~a" TraeTen1 TraeTen2)) ;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 Ausgabe (format nil "~12,4f : ~a : ~a : ~a" mas Abstand_SP falsches_Moment Benennung)) (setq Ausgabeliste (cons Ausgabe Ausgabeliste)) ) );if ); progn dolist );;dolist );;losgehts );;local-functions :ok-action '(progn (setq Ausgabeliste nil) (los_gehts);Teile prüfen (display " ") (display (format nil " Überprüfen Schwerpunkt und Trägheitstensoren für Baugruppe: ~a" (sd-inq-obj-basename TEIL))) (display " Masse : Diff Schwerpunkt : Diff Trägheit : Exemplarname : Modelname") (display " [kg] : [mm] : [gmm²] : : ") (display " ========== ================ ============= ============ : =========") ;Ergebnisse auflisten (dolist (Ergebnisse Ausgabeliste) (display (format nil "~a" Ergebnisse)) );dolist (display (format nil "=== fertig ===~%")) );ok-action );;sd-defdialog ;Exemplare aus der Liste entfernen (defun unique-objects(objects) (let ((ht (make-hash-table :test 'equal))) (dolist (obj objects) ; (pprint (sd-inq-obj-basename obj)) (setf (gethash (oli:sd-inq-obj-contents-sysid obj) ht) obj)) (loop for obj being the hash-values of ht collect obj)))