Class: Model3mf

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby3mf/model3mf.rb

Class Method Summary collapse

Class Method Details

.parse(document, zip_entry) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ruby3mf/model3mf.rb', line 3

def self.parse(document, zip_entry)
  model_doc = nil

  Log3mf.context "parsing model" do |l|
    begin
      model_doc = Nokogiri::XML(zip_entry.get_input_stream) do |config|
        config.strict.nonet.noblanks
      end
      l.info "We Found a Model, and it's XML!"
    rescue Nokogiri::XML::SyntaxError => e
      l.fatal_error "Model file invalid XML. Exception #{e}"
    end

    l.context "verifying 3D payload required resources" do |l|
      # results = model_doc.css("model resources m:texture2d")
      required_resources = model_doc.css("//model//resources//*[path]").collect { |n| n["path"] }

      # for each, ensure that they exist in m.relationships
      relationship_resources = document.relationships.map { |relationship| relationship[:target] }

      missing_resources = (required_resources - relationship_resources)
      if missing_resources.empty?
        l.info "All model required resources are defined in .rels relationship files."
      else
        missing_resources.each { |mr|
          l.error "Missing required resource: #{mr} Resource referenced in model, but not in .rels relationship file", page: 10
        }
      end

      l.context "verifying 3D resource types" do |l|
        model_types = model_doc.css("//model//resources//*[path]").collect { |t| t["contenttype"] }

        #for each, ensure they exist in ContentTypes
        all_types = document.types.map { |t, v| v }

        bad_types = (model_types - all_types)
        if bad_types.empty?
          l.info "All model resource contenttypes are valid"
        else
          bad_types.each { |bt|
            puts "bad type: #{bt}"
            l.error "resource in model has invalid contenttype #{bt}", page: 10
          }
        end
      end

    end
  end
  model_doc
end