#| Ersteller/Creator: Patrick Weber Datum/Date: 2011-02-12 Diskussion/Thread: http://ww3.cad.de/foren/ubb/Forum29/HTML/003794.shtml Umschifft elegant das Problem der langen bzw. unmöglichen Ladezeiten von sehr umfangreichen Punktwolken, indem eine STEP-Datei erzeugt wird, die vom System deutlich schneller geladen werden kann. Erweitert von MiBr@forum@cad.de mit Unterstützung von der_Wolfgang@forum@cad.de Datum: 25.07.2019 Download : https://ww3.cad.de/foren/ubb/Forum29/HTML/004745.shtml - Die Anzahl der gewünschten Punkte aus der gsamt Wolke kann angegeben werden - Anzeige der gesamten Punkte der Wolke - Prozentuale Anzeige der übernommenen Punkte - zusätzliche Optionen: Step anschließend laden-löschen / Teileprüfung / Eckpunkte Ein |# (in-package :custom) (use-package :oli) (sd-defdialog 'ascii-3d-to-step-dialog :dialog-title '(sd-multi-lang-string "ASCII(3D)-STEP-Convertor" :german "ASCII(3D)-STEP-Konverter") :toolbox-button nil :variables '( (InFile :value-type :filename :title (sd-multi-lang-string "ASCII file-->" :german "ASCII-Datei-->") :direction :input :prompt-text (sd-multi-lang-string "Specify source file" :german "Quelldatei angeben") :filename-incl-path t :initialPattern "*.*" :next-variable 'OutFile :after-input (progn (file_size) (when detect_lines (calculated_percent))) ) (OutFile :value-type :filename :title (sd-multi-lang-string "STEP file<--" :german "STEP-Datei<--") :prompt-text (sd-multi-lang-string "Specify destination file (STEP AP214)" :german "Zieldatei angeben (STEP AP214)") :direction :output :if-exist :confirm-overwrite :initialdirectory (sd-get-current-working-directory) :filename-incl-path t :initialPattern (sd-multi-lang-string "cloud.stp" :german "Punktewolke.stp") ) ("-") (Delimiter :value-type :string :initial-value "," :proposals '(" " "," ";" "_" "tabulator") :title (sd-multi-lang-string "delimiter" :german "Separatorzeichen") :prompt-text (sd-multi-lang-string "Specify delimiter" :german "Separatorzeichen wählen") ) (Offset :value-type :integer :title (sd-multi-lang-string "Offset" :german "Offset") :prompt-text (sd-multi-lang-string "column offset (column where your x-component is located)" :german "Spaltenversatz (Spalte, in der die x-Komponente steht)") :initial-value 0 ) ("-") (file_complete :value-type :number :initial-value nil :initial-visible nil :title (sd-multi-lang-string "File size complete" :german "Dateigröße komplett") ) (file_section :value-type :number :initial-value nil :initial-visible nil :title (sd-multi-lang-string "File size at X lines" :german "Dateigr. bei X Linien") ) (detect_lines :value-type :display-only :initial-value nil :title (sd-multi-lang-string "Detect Points" :german "Ermittelte Punkte") :gui-value (when detect_lines (sd-string-replace (sd-write-to-string (format nil "~,0F" detect_lines)) "." "")) ) (percent :value-type :display-only :initial-value 100 :title (sd-multi-lang-string "Points cloud %" :german "Punktewolke %") :after-input (when (> percent 100) (sd-set-variable-status 'percent :value 100)) :gui-value (when percent (format nil "~,2F" percent)) ) (desired_points :value-type :positive-number :initial-value 100000 :initial-enable nil :proposals (50000 100000 150000 200000 250000 300000 400000 500000) :title (sd-multi-lang-string "Desired points" :german "Gew. Anzahl Pkt") :prompt-text (sd-multi-lang-string "Desired number of points" :german "Gewünschte Anzahl an Punkten") :after-input (calculated_percent) ) ("-") (load_after :value-type :boolean :toggle-type :grouped-toggle :initial-value t :title (sd-multi-lang-string "load Step" :german "Step laden") :after-input (if load_after (progn (sd-set-variable-status 'load_check :enable t) (sd-set-variable-status 'delete_file :enable t) (sd-set-variable-status 'Corner_points :enable t)) (progn (sd-set-variable-status 'load_check :enable nil) (sd-set-variable-status 'delete_file :enable nil) (sd-set-variable-status 'Corner_points :enable nil)) ) ) (delete_file :value-type :boolean :toggle-type :grouped-toggle :initial-value t :title (sd-multi-lang-string "delete STEP file" :german "Step-File löschen") ) (load_check :value-type :boolean :toggle-type :grouped-toggle :initial-value nil :title (sd-multi-lang-string "Check part" :german "Teileprüfung") ) (corner_points :value-type :boolean :toggle-type :grouped-toggle :initial-value t :title (sd-multi-lang-string "Corner points" :german "Eckpunkte Ein") ) ) ;end variable :ok-action '(let () (when (string-equal Delimiter "tabulator") (setq Delimiter #\Tab)) (ascii-3d-to-step (first InFile) (first OutFile) Delimiter Offset percent) (when Load_after (if Load_check (sd-call-cmds (step_import :check-part :yes :CONNECTED :NO :PROCESSOR-DIRECT :filename (first OutFile))) (sd-call-cmds (step_import :check-part :no :CONNECTED :NO :PROCESSOR-DIRECT :filename (first OutFile))) ) (when corner_points (set_show (sd-inq-current-vp) :3dgeo_vertices :on)) (when delete_file (delete-file (first OutFile))) ) ) :local-functions '( (file_size () (let ((zeilen_pts 0) (outfile_temp (format nil "~awolke.txt" (sd-inq-temp-dir)))) (sd-set-variable-status 'detect_lines :value nil) (sd-set-variable-status 'percent :value 100) (with-open-file (out outfile_temp :direction :output :if-exists :supersede :if-does-not-exist :create :external-format :legacy ) (with-open-file (instream (first InFile)) (loop for line = (read-line instream nil) while line do (setq zeilen_pts (+ zeilen_pts 1)) (format out "~a~%" line) (when (= zeilen_pts 100000) (return)) ) ;endloop ) ;with-open-file ) ;end with-open-file (if (= zeilen_pts 100000) (progn (sd-set-variable-status 'file_complete :value (sd-inq-file-size (first InFile))) (sd-set-variable-status 'file_section :value (sd-inq-file-size outfile_temp)) (sd-set-variable-status 'detect_lines :value (* (/ 100000 file_section) file_complete)) ) (progn (setq zeilen_pts 0) (with-open-file (instream (first InFile)) (loop for line = (read-line instream nil) while line do (setq zeilen_pts(+ zeilen_pts 1)) ) ;endloop ) ;with-open-file (sd-set-variable-status 'detect_lines :value zeilen_pts) (sd-set-variable-status 'desired_points :value zeilen_pts) ) ) (sd-set-variable-status 'desired_points :enable t) (delete-file outfile_temp) ) ) ;end file_size (calculated_percent () (sd-set-variable-status 'percent :value (* 100 (/ desired_points detect_lines))) ) ;end calculated_percent ) ;end local-functions ) ;end sd-defdialog (defun ascii-3d-to-step (Ascii_filename Step_filename Delimiter Offset percent) (let ((k 0) (p 0)) (sd-show-console-window) (when (sd-search-file Step_filename) (delete-file (sd-convert-filename-to-platform Step_filename)) ) (format t "~%ASCII(3D)-STEP-Convertor~%~%CTRL-C to abort~%~%") (with-open-file (FI Step_filename :direction :output :if-exists :overwrite :if-does-not-exist :create) (format FI "ISO-10303-21;~%HEADER;~%FILE_DESCRIPTION((''),'2;1');~%FILE_NAME('cloud.stp','2000-01-01T00:00:00',(''),(''),~%'',~%'','');~%FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));~%ENDSEC;~%DATA;~%") (with-open-file (Ascii_file Ascii_filename :direction :input :if-does-not-exist nil) (loop while (setq Line_ (read-line Ascii_file nil)) do (setq p (+ p percent)) (when (>= p 100) (let ((xyz_ (sd-string-split (remove #\Return Line_) Delimiter))) (setq k (+ k 10)) (format FI "#~A=CARTESIAN_POINT('',(~A,~A,~A));~%" k (nth (+ 0 Offset) xyz_) (nth (+ 1 Offset) xyz_) (nth (+ 2 Offset) xyz_)) (when (integerp (/ k 1000)) (format t "Step 1/2: Writing coordinates: line ~A~A" (/ k 10) #\Return) ) ) (setq p (- p 100)) ) ) ) (setq k (+ k 10)) (format t "~%") (format FI "#~A=GEOMETRIC_CURVE_SET('',(~%" k) (loop for i from 10 to (- k 10) by 10 do (progn (if (< i (- k 10)) (format FI "#~A,~%" i) (format FI "#~A~%" i) ) (when (integerp (/ i 1000)) (format t "Step 2/2: Writing GEOMETRIC_CURVE_SET: line ~A~A" (/ i 10) #\Return) ) ) ) (format FI "));~%") (setq k (+ k 10)) (format FI "#~A=CARTESIAN_POINT('',(0.,0.,0.));~%" k) (format FI "#~A=DIRECTION('',(0.,0.,1.));~%" (+ k 10)) (format FI "#~A=DIRECTION('',(1.,0.,0.));~%" (+ k 20)) (format FI "#~A=AXIS2_PLACEMENT_3D('',#~A,#~A,#~A);~%" (+ k 30) k (+ k 10) (+ k 20)) (format FI "#~A=APPLICATION_CONTEXT(' ');~%" (+ k 40)) (format FI "#~A=APPLICATION_PROTOCOL_DEFINITION(' ','automotive_design',1998,~%#~A);~%" (+ k 50) (+ k 40)) (format FI "#~A=PRODUCT_CONTEXT('',#~A,'mechanical');~%" (+ k 60) (+ k 40)) (format FI "#~A=PRODUCT_DEFINITION_CONTEXT('part definition',#~A,'design');~%" (+ k 70)(+ k 40)) (format FI "#~A=PRODUCT('CloudT1','CloudT1','',(#~A));~%" (+ k 80) (+ k 60)) (format FI "#~A=PRODUCT_RELATED_PRODUCT_CATEGORY('part',' ',(#~A));~%" (+ k 90) (+ k 80)) (format FI "#~A=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#~A~%,.BOUGHT.);~%" (+ k 100) (+ k 80)) (format FI "#~A=PRODUCT_DEFINITION('',' ',#~A,#~A);~%" (+ k 110) (+ k 100) (+ k 70)) (format FI "#~A=PRODUCT_DEFINITION_SHAPE('','',#~A);~%" (+ k 120) (+ k 110)) (format FI "#~A=DIMENSIONAL_EXPONENTS(1.,0.,0.,0.,0.,0.,0.);~%" (+ k 130)) (format FI "#~A=DIMENSIONAL_EXPONENTS(0.,0.,0.,0.,0.,0.,0.);~%" (+ k 140)) (format FI "#~A=DIMENSIONAL_EXPONENTS(0.,0.,0.,0.,0.,0.,0.);~%" (+ k 150)) (format FI "#~A=(LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.));~%" (+ k 160)) (format FI "#~A=(NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.));~%" (+ k 170)) (format FI "#~A=(NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT());~%" (+ k 180)) (format FI "#~A=(GEOMETRIC_REPRESENTATION_CONTEXT(3) ~%GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#~A)) ~%GLOBAL_UNIT_ASSIGNED_CONTEXT((#~A,#~A,#~A)) ~%REPRESENTATION_CONTEXT('',''));~%" (+ k 190) (+ k 200) (+ k 160) (+ k 170) (+ k 180)) (format FI "#~A=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-6),#~A,~%'distance_accuracy_value','maximum gap value');~%" (+ k 200)(+ k 160)) (format FI "#~A=GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#~A~%,#~A),#~A);~%" (+ k 210) (+ k 30) (- k 10) (+ k 190)) (format FI "#~A=SHAPE_DEFINITION_REPRESENTATION(#~A,#~A);~%" (+ k 220) (+ k 120) (+ k 210)) (format FI "#~A=COLOUR_RGB('',0.6,0.6,0.6);~%" (+ k 230)) (format FI "#~A=DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');~%" (+ k 240)) (format FI "#~A=CURVE_STYLE('',#~A,POSITIVE_LENGTH_MEASURE(0.1),#~A);~%" (+ k 250) (+ k 240) (+ k 230)) (format FI "#~A=PRESENTATION_STYLE_ASSIGNMENT((#~A));~%" (+ k 260) (+ k 250)) (format FI "#~A=STYLED_ITEM('',(#~A),#~A);~%" (+ k 270) (+ k 260) (- k 10)) (format FI "#~A=DRAUGHTING_MODEL('',(#~A),#~A);~%" (+ k 280) (+ k 270) (+ k 190)) (format FI "ENDSEC;~%END-ISO-10303-21;~%") (format t "~%Done.~%") ) ) (sd-hide-console-window) )