fml 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/bin/fml2dae.rb CHANGED
@@ -10,6 +10,6 @@ else
10
10
  ARGV.shift
11
11
  xrefs = true
12
12
  end
13
- doc = Floorplanner::Document.new(ARGV[0])
14
- doc.to_dae(ARGV[1],xrefs)
13
+ doc = Floorplanner::Document.new(ARGV[1])
14
+ doc.to_dae(ARGV[0],ARGV[2],xrefs)
15
15
  end
data/fml.gemspec CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "fml"
5
- s.version = "0.2.1"
6
- s.date = "2009-09-23"
5
+ s.version = "0.2.2"
6
+ s.date = "2010-04-26"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.0") if s.respond_to? :required_rubygems_version=
9
9
 
data/lib/config.yml CHANGED
@@ -2,8 +2,6 @@ content_base_url: http://cdn.floorplanner.com/assets/
2
2
  dae_cache_path: /home/skrat/workspace/floorplanner/fml2dae_cache/
3
3
  area_textures_path: /home/skrat/workspace/floorplanner/fml2dae_cache/textures_2d/
4
4
 
5
- wall_height: 2.2
6
- wall_thickness: 0.25
7
5
  geom_snap: 0.1
8
6
  uniq_snap: 0.0000005
9
7
  openings:
data/lib/floorplanner.rb CHANGED
@@ -4,7 +4,6 @@ require 'find'
4
4
  require 'open-uri'
5
5
  require 'net/http'
6
6
  require 'fileutils'
7
- require 'logger'
8
7
 
9
8
  require 'rubygems'
10
9
  require 'zip/zip'
@@ -13,11 +12,6 @@ require 'xml'
13
12
  $LOAD_PATH.push(File.dirname(__FILE__))
14
13
 
15
14
  module Floorplanner
16
-
17
- Log = Logger.new STDOUT
18
- Log.level = Logger::WARN
19
- Log.datetime_format = "%Y-%m-%d %H:%M:%S "
20
-
21
15
  def self.config
22
16
  @@config ||= YAML.load_file(File.join(File.dirname(__FILE__),'config.yml'))
23
17
  end
@@ -19,11 +19,11 @@ module Floorplanner
19
19
 
20
20
  cached_path = File.join(CACHE_PATH,asset_id)
21
21
  if File.exists?(cached_path)
22
- Log.info "Cached asset: #{asset_id}"
22
+ $stderr.puts("Cached asset: %s" % asset_id)
23
23
  @kmz = Keyhole::Archive.new(cached_path)
24
24
  Asset.new(asset_id,asset_title,@kmz)
25
25
  else
26
- Log.info "Downloading asset: #{asset_url}"
26
+ $stderr.puts("Downloading asset: %s" % asset_url)
27
27
  cached = File.new(cached_path,'w')
28
28
  remote = open(asset_url)
29
29
  cached.write(remote.read)
@@ -1,8 +1,8 @@
1
1
  module Floorplanner
2
2
  class Document
3
3
 
4
- def to_dae(out_path,xrefs=false)
5
- @design = Design.new(@xml)
4
+ def to_dae(design_id,out_path,xrefs=false)
5
+ @design = Design.new(@xml,design_id)
6
6
  @design.build_geometries
7
7
  @design.save_textures(File.dirname(out_path)) unless xrefs
8
8
  dae = File.new(out_path,'w')
@@ -13,7 +13,7 @@ module Floorplanner
13
13
  end
14
14
 
15
15
  module ColladaExport
16
- DESIGN_QUERY = "/design"
16
+ DESIGN_QUERY = "/project/floors/floor/designs/design[id='%s']"
17
17
  ASSET_QUERY = DESIGN_QUERY+"/assets/asset[@id='%s']"
18
18
  ASSETS_QUERY = DESIGN_QUERY+"/assets/asset"
19
19
  OBJECTS_QUERY = DESIGN_QUERY+"/objects/object"
@@ -37,7 +37,7 @@ module Floorplanner
37
37
  def assets
38
38
  return @assets if @assets
39
39
  @assets = {}
40
- @xml.find(ASSETS_QUERY).each do |asset_node|
40
+ @xml.find(ASSETS_QUERY % @design_id).each do |asset_node|
41
41
  asset_id = asset_node.attributes['id']
42
42
  name = asset_node.find('name').first.content
43
43
  url3d = asset_node.find('url3d').first
@@ -54,7 +54,7 @@ module Floorplanner
54
54
 
55
55
  def objects
56
56
  result = []
57
- @xml.find(OBJECTS_QUERY).each do |object|
57
+ @xml.find(OBJECTS_QUERY % @design_id).each do |object|
58
58
  begin
59
59
  refid = object.find('asset').first.attributes['refid']
60
60
  next unless assets[refid]
@@ -1,6 +1,7 @@
1
1
  module Floorplanner
2
2
  class Design
3
- DESIGN_QUERY = "/design"
3
+ DESIGN_QUERY = "/project/floors/floor/designs/design[id='%s']"
4
+ DESIGN_N_QUERY = "/project/floors/floor/designs/design[name='%s']"
4
5
  ASSET_QUERY = DESIGN_QUERY+"/assets/asset[@id='%s']"
5
6
  ASSET_URL2D = ASSET_QUERY+"/url2d"
6
7
  LINES_QUERY = DESIGN_QUERY+"/lines/line"
@@ -16,13 +17,18 @@ module Floorplanner
16
17
  ##
17
18
  # Constructs new floorplan design from FML
18
19
  ##
19
- def initialize(fml)
20
+ def initialize(fml,design_id)
20
21
  begin
21
22
  @xml = fml
22
- @name = @xml.find(NAME_QUERY).first.content
23
+ unless fml.find(DESIGN_QUERY % design_id).length.zero?
24
+ @design_id = design_id
25
+ else
26
+ @design_id = fml.find(DESIGN_N_QUERY % design_id).first.find("id").first.content
27
+ end
28
+ @name = @xml.find(NAME_QUERY % @design_id).first.content
23
29
  @author = "John Doe" # TODO from <author> element if included in FML
24
30
  rescue NoMethodError
25
- Log.error "Can't load FML"
31
+ $stderr.puts "Can't find Design with ID or name: %s" % design_id
26
32
  end
27
33
  end
28
34
 
@@ -31,18 +37,13 @@ module Floorplanner
31
37
  ##
32
38
  def build_geometries
33
39
  @areas = AreaBuilder.new do |b|
34
- @xml.find(AREAS_QUERY).each do |area|
35
- name = area.find('name').first
36
- name = name.content if name
37
- color = area.find('color').first
38
- color = color.content if color
40
+ @xml.find(AREAS_QUERY % @design_id).each do |area|
41
+ name = area.find('name').first.content
42
+ color = area.find('color').first.content
39
43
  type = area.find('type').first.content
40
44
 
41
- asset_id = area.find('asset').first
42
- asset_id = asset_id.attributes['refid'] if asset_id
43
- if asset_id
44
- texture_url = @xml.find(ASSET_URL2D % [asset_id]).first.content
45
- end
45
+ asset_id = area.find('asset').first.attributes['refid']
46
+ texture_url = @xml.find(ASSET_URL2D % [@design_id,asset_id]).first.content
46
47
 
47
48
  vertices = Array.new
48
49
  area.find('points').first.content.split(',').each do |str_v|
@@ -65,13 +66,11 @@ module Floorplanner
65
66
  end
66
67
  min_height = 10
67
68
  @walls = WallBuilder.new do |b|
68
- @xml.find(LINES_QUERY).each do |line|
69
+ @xml.find(LINES_QUERY % @design_id).each do |line|
69
70
  floats = line.find('points').first.get_floats
70
71
 
71
- thickness = line.find('thickness').first
72
- thickness = thickness ? thickness.content.to_f : Floorplanner.config['wall_thickness']
73
- height = line.find('height').first
74
- height = height ? height.content.to_f : Floorplanner.config['wall_height']
72
+ thickness = line.find('thickness').first.content.to_f
73
+ height = line.find('height').first.content.to_f
75
74
 
76
75
  # TODO: fix this in Flash app
77
76
  floats[1] *= -1.0; floats[4] *= -1.0
@@ -87,7 +86,7 @@ module Floorplanner
87
86
  @areas.update min_height
88
87
 
89
88
  @walls.prepare
90
- @xml.find(OPENINGS_QUERY).each do |opening|
89
+ @xml.find(OPENINGS_QUERY % @design_id).each do |opening|
91
90
  pos_floats = opening.find('points').first.get_floats
92
91
 
93
92
  # TODO: fix y coord in Flash app
@@ -98,7 +97,7 @@ module Floorplanner
98
97
  size = Geom::Number3D.new(*size_floats)
99
98
 
100
99
  asset_id = opening.find('asset').first.attributes['refid']
101
- asset = @xml.find(ASSET_QUERY % [asset_id]).first
100
+ asset = @xml.find(ASSET_QUERY % [@design_id,asset_id]).first
102
101
  type = asset.find('url2d').first.content.match(/door/i) ? Opening3D::TYPE_DOOR : Opening3D::TYPE_WINDOW
103
102
  @walls.opening(position,size,type)
104
103
  end
@@ -1,7 +1,6 @@
1
1
  module Floorplanner
2
2
 
3
3
  class Document
4
-
5
4
  POINTS_QUERY = "/project/floors/floor/designs/design/area/line/points"
6
5
  LINE_POINTS_REGEXP = /^((\s*[-+]?[0-9]*\.?[0-9]+\s+){5,8}\s*[-+]?[0-9]*\.?[0-9]+\s*?(?:,)?)*$/
7
6
 
@@ -10,11 +9,11 @@ module Floorplanner
10
9
  end
11
10
 
12
11
  def self.validate(doc)
13
- schema = XML::Schema.document(
14
- XML::Document.file(File.join(File.dirname(__FILE__), "..", "..", "xml", "fml-permissive.xsd"))
12
+ schema = XML::RelaxNG.document(
13
+ XML::Document.file(File.join(File.dirname(__FILE__), "..", "..", "xml", "fml.rng"))
15
14
  )
16
15
  doc = XML::Document.file(doc) if doc.instance_of?(String)
17
- doc.validate_schema(schema) do |message,error|
16
+ doc.validate_relaxng(schema) do |message,error|
18
17
  # TODO throw an exception
19
18
  puts message if error
20
19
  end
@@ -34,8 +33,16 @@ module Floorplanner
34
33
 
35
34
  class DesignDocument
36
35
 
37
- def initialize(fml_fn)
38
- @xml = LibXML::XML::Document.file(fml_fn)
36
+ def initialize(fml)
37
+ if fml.kind_of? String # filename
38
+ @xml = XML::Document.file(fml)
39
+ elsif fml.kind_of? XML::Document
40
+ @xml = fml
41
+ elsif fml.respond_to?(:read) # IO
42
+ @xml = XML::Document.io(fml)
43
+ else
44
+ raise ArgumentError.new("values must be one of: filename, IO, XML::Document")
45
+ end
39
46
  end
40
47
 
41
48
  def update_heights(new_height)
@@ -60,8 +67,28 @@ module Floorplanner
60
67
  end
61
68
  end
62
69
 
63
- def save(fn)
64
- @xml.save fn
70
+ def update_thumb_2d_url(thumb_2d_url)
71
+ if thumb_node = @xml.find_first('/design/thumb-2d-url')
72
+ thumb_node.content = thumb_2d_url
73
+ elsif design_node = @xml.find_first('/design')
74
+ thumb_node = XML::Node.new('thumb-2d-url')
75
+ thumb_node.content = thumb_2d_url
76
+ design_node << thumb_node
77
+ else
78
+ raise "Cannot update the 2D thumb URL!"
79
+ end
80
+ end
81
+
82
+ def save(path)
83
+ @xml.save path
84
+ end
85
+
86
+ def to_xml
87
+ @xml
88
+ end
89
+
90
+ def to_s
91
+ @xml.to_s
65
92
  end
66
93
  end
67
94
 
@@ -111,7 +111,7 @@ module Floorplanner
111
111
  @faces.concat(wall.faces)
112
112
  end
113
113
 
114
- Log.info "Walls Vertices before: #{@vertices.length.to_s}"
114
+ $stderr.puts "Walls Vertices before: #{@vertices.length.to_s}"
115
115
  # remove same instances
116
116
  @vertices.uniq!
117
117
  # remove same vertices
@@ -120,8 +120,8 @@ module Floorplanner
120
120
  old.each do |v|
121
121
  @vertices.push(v) unless @vertices.include?(v) # find_vertex(@vertices,v) #
122
122
  end
123
- Log.info "Walls Vertices: #{@vertices.length.to_s}"
124
- Log.info "Walls Faces : #{@faces.length.to_s}"
123
+ $stderr.puts "Walls Vertices: #{@vertices.length.to_s}"
124
+ $stderr.puts "Walls Faces : #{@faces.length.to_s}"
125
125
  end
126
126
 
127
127
  # make use of cache
@@ -119,19 +119,20 @@ module GithubGem
119
119
  checks = [:check_current_branch, :check_clean_status, :check_not_diverged, :check_version]
120
120
  checks.unshift('spec:basic') if has_specs?
121
121
  checks.unshift('test:basic') if has_tests?
122
- checks.push << [:check_rubyforge] if gemspec.rubyforge_project
122
+ # checks.push << [:check_rubyforge] if gemspec.rubyforge_project
123
123
 
124
124
  desc "Perform all checks that would occur before a release"
125
125
  task(:release_checks => checks)
126
126
 
127
- release_tasks = [:release_checks, :set_version, :build, :github_release]
128
- release_tasks << [:rubyforge_release] if gemspec.rubyforge_project
127
+ release_tasks = [:release_checks, :set_version, :build, :github_release, :gemcutter_release]
128
+ # release_tasks << [:rubyforge_release] if gemspec.rubyforge_project
129
129
 
130
130
  desc "Release a new verison of the gem"
131
131
  task(:release => release_tasks) { release_task }
132
132
 
133
- task(:check_rubyforge) { check_rubyforge_task }
134
- task(:rubyforge_release) { rubyforge_release_task }
133
+ # task(:check_rubyforge) { check_rubyforge_task }
134
+ # task(:rubyforge_release) { rubyforge_release_task }
135
+ task(:gemcutter_release) { gemcutter_release_task }
135
136
  task(:github_release => [:commit_modified_files, :tag_version]) { github_release_task }
136
137
  task(:tag_version) { tag_version_task }
137
138
  task(:commit_modified_files) { commit_modified_files_task }
@@ -179,7 +180,7 @@ module GithubGem
179
180
 
180
181
  # Checks whether the current branch is not diverged from the remote branch
181
182
  def check_not_diverged_task
182
- raise "The current branch is diverged from the remote branch!" if git.log.between('HEAD', git.branches["#{remote}/#{remote_branch}"].gcommit).any?
183
+ raise "The current branch is diverged from the remote branch!" if git.log.between('HEAD', git.remote(remote).branch(remote_branch).gcommit).any?
183
184
  end
184
185
 
185
186
  # Checks whether the repository status ic clean
@@ -215,18 +216,22 @@ module GithubGem
215
216
  git.push(remote, remote_branch, true)
216
217
  end
217
218
 
218
- # Checks whether Rubyforge is configured properly
219
- def check_rubyforge_task
220
- # Login no longer necessary when using rubyforge 2.0.0 gem
221
- # raise "Could not login on rubyforge!" unless `rubyforge login 2>&1`.strip.empty?
222
- output = `rubyforge names`.split("\n")
223
- raise "Rubyforge group not found!" unless output.any? { |line| %r[^groups\s*\:.*\b#{Regexp.quote(gemspec.rubyforge_project)}\b.*] =~ line }
224
- raise "Rubyforge package not found!" unless output.any? { |line| %r[^packages\s*\:.*\b#{Regexp.quote(gemspec.name)}\b.*] =~ line }
225
- end
226
-
227
- # Task to release the .gem file toRubyforge.
228
- def rubyforge_release_task
229
- sh 'rubyforge', 'add_release', gemspec.rubyforge_project, gemspec.name, gemspec.version.to_s, "pkg/#{gemspec.name}-#{gemspec.version}.gem"
219
+ # # Checks whether Rubyforge is configured properly
220
+ # def check_rubyforge_task
221
+ # # Login no longer necessary when using rubyforge 2.0.0 gem
222
+ # # raise "Could not login on rubyforge!" unless `rubyforge login 2>&1`.strip.empty?
223
+ # output = `rubyforge names`.split("\n")
224
+ # raise "Rubyforge group not found!" unless output.any? { |line| %r[^groups\s*\:.*\b#{Regexp.quote(gemspec.rubyforge_project)}\b.*] =~ line }
225
+ # raise "Rubyforge package not found!" unless output.any? { |line| %r[^packages\s*\:.*\b#{Regexp.quote(gemspec.name)}\b.*] =~ line }
226
+ # end
227
+
228
+ # # Task to release the .gem file toRubyforge.
229
+ # def rubyforge_release_task
230
+ # sh 'rubyforge', 'add_release', gemspec.rubyforge_project, gemspec.name, gemspec.version.to_s, "pkg/#{gemspec.name}-#{gemspec.version}.gem"
231
+ # end
232
+
233
+ def gemcutter_release_task
234
+ sh "gem push pkg/#{gemspec.name}-#{gemspec.version}.gem"
230
235
  end
231
236
 
232
237
  # Gem release task.
@@ -308,7 +313,15 @@ module GithubGem
308
313
  response = http.get(path)
309
314
  open(__FILE__, "w") { |file| file.write(response.body) }
310
315
  end
311
- puts "Updated gem release tasks file with latest version."
316
+
317
+ relative_file = File.expand_path(__FILE__).sub(%r[^#{git.dir.path}/], '')
318
+ if git.status[relative_file] && git.status[relative_file].type == 'M'
319
+ git.add(relative_file)
320
+ git.commit("Updated to latest gem release management tasks.")
321
+ puts "Updated to latest version of gem release management tasks."
322
+ else
323
+ puts "Release managament tasks already are at the latest version."
324
+ end
312
325
  end
313
326
 
314
327
  end
data/views/design.dae.erb CHANGED
@@ -16,6 +16,8 @@
16
16
  <technique_common>
17
17
  <perspective>
18
18
  <yfov>70</yfov>
19
+ <znear>0.1</znear>
20
+ <zfar>100.0</zfar>
19
21
  </perspective>
20
22
  </technique_common>
21
23
  </optics>
@@ -334,6 +336,7 @@
334
336
  <resolution>800 600</resolution>
335
337
  <aa>0 2</aa>
336
338
  <filter>gaussian</filter>
339
+ <sampler>ipr</sampler>
337
340
  </image>
338
341
  <trace_depths>
339
342
  <diffuse>4</diffuse>
@@ -346,25 +349,22 @@
346
349
  <samples>64</samples>
347
350
  <maxdist>3.0 </maxdist>
348
351
  </gi>
349
- <background>
350
- <color>1.0 1.0 1.0</color>
351
- </background>
352
- <!--sunsky>
352
+ <sunsky>
353
353
  <up>0 0 1</up>
354
354
  <east>1 0 0</east>
355
355
  <sundir>0.2 0.4 0.7</sundir>
356
356
  <ground>1 1 1</ground>
357
- </sunsky-->
357
+ </sunsky>
358
358
  </technique>
359
359
  </extra>
360
- <!--node id="Camera" name="Camera">
360
+ <node id="Camera" name="Camera">
361
361
  <lookat>
362
362
  9.0 -1.0 1.4
363
363
  8.0 -2.0 1.4
364
364
  0.0 0.0 1.0
365
365
  </lookat>
366
366
  <instance_camera url="#main-cam"/>
367
- </node-->
367
+ </node>
368
368
  <node id="Walls" name="Walls">
369
369
  <instance_geometry url="#walls-geom">
370
370
  <bind_material>
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 2
9
+ version: 0.2.2
5
10
  platform: ruby
6
11
  authors:
7
12
  - Dusan Maliarik
@@ -9,29 +14,33 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-09-23 00:00:00 +02:00
17
+ date: 2010-04-26 00:00:00 +02:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: libxml-ruby
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
23
29
  version: "0"
24
- version:
30
+ type: :runtime
31
+ version_requirements: *id001
25
32
  - !ruby/object:Gem::Dependency
26
33
  name: rubyzip
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
33
41
  version: "0"
34
- version:
42
+ type: :runtime
43
+ version_requirements: *id002
35
44
  description: Floor plan document toolkit
36
45
  email: dusan.maliarik@gmail.com
37
46
  executables:
@@ -98,18 +107,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
107
  requirements:
99
108
  - - ">="
100
109
  - !ruby/object:Gem::Version
110
+ segments:
111
+ - 0
101
112
  version: "0"
102
- version:
103
113
  required_rubygems_version: !ruby/object:Gem::Requirement
104
114
  requirements:
105
115
  - - ">="
106
116
  - !ruby/object:Gem::Version
117
+ segments:
118
+ - 1
119
+ - 3
120
+ - 0
107
121
  version: 1.3.0
108
- version:
109
122
  requirements: []
110
123
 
111
124
  rubyforge_project:
112
- rubygems_version: 1.3.5
125
+ rubygems_version: 1.3.6
113
126
  signing_key:
114
127
  specification_version: 2
115
128
  summary: Floorplanner.com FML document toolkit