topolys 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,135 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema#",
3
+ "id": "http://json-schema.org/automaticmagic/topolys.json#",
4
+ "title": "Topolys Schema",
5
+ "description": "Schema for the Topolys Model",
6
+
7
+ "type": "object",
8
+ "properties": {
9
+ "vertices": {
10
+ "type": "array",
11
+ "items": { "$ref": "#/definitions/Vertex" },
12
+ "default": []
13
+ },
14
+ "edges": {
15
+ "type": "array",
16
+ "items": { "$ref": "#/definitions/Edge" },
17
+ "default": []
18
+ },
19
+ "directed_edges": {
20
+ "type": "array",
21
+ "items": { "$ref": "#/definitions/DirectedEdge" },
22
+ "default": []
23
+ },
24
+ "wires": {
25
+ "type": "array",
26
+ "items": { "$ref": "#/definitions/Wire" },
27
+ "default": []
28
+ },
29
+ "faces": {
30
+ "type": "array",
31
+ "items": { "$ref": "#/definitions/Face" },
32
+ "default": []
33
+ },
34
+ "shells": {
35
+ "type": "array",
36
+ "items": { "$ref": "#/definitions/Shell" },
37
+ "default": []
38
+ }
39
+ },
40
+
41
+ "definitions": {
42
+ "Point3D": {
43
+ "type": "object",
44
+ "properties": {
45
+ "x": { "type": "number" },
46
+ "y": { "type": "number" },
47
+ "z": { "type": "number" }
48
+ },
49
+ "additionalProperties": false,
50
+ "required": ["x", "y", "z"]
51
+ },
52
+ "Vector3D": {
53
+ "type": "object",
54
+ "properties": {
55
+ "x": { "type": "number" },
56
+ "y": { "type": "number" },
57
+ "z": { "type": "number" }
58
+ },
59
+ "additionalProperties": false,
60
+ "required": ["x", "y", "z"]
61
+ },
62
+ "Plane3D": {
63
+ "type": "object",
64
+ "properties": {
65
+ "point": { "$ref": "#/definitions/Point3D" },
66
+ "normal": { "$ref": "#/definitions/Vector3D" }
67
+ },
68
+ "additionalProperties": false,
69
+ "required": ["x", "y", "z"]
70
+ },
71
+ "Vertex": {
72
+ "type": "object",
73
+ "properties": {
74
+ "id": { "type": "string" },
75
+ "attributes": { "type": "object", "additionalProperties": true },
76
+ "point": { "$ref": "#/definitions/Point3D" }
77
+ },
78
+ "additionalProperties": false,
79
+ "required": ["id", "point"]
80
+ },
81
+ "Edge": {
82
+ "type": "object",
83
+ "properties": {
84
+ "id": { "type": "string" },
85
+ "attributes": { "type": "object", "additionalProperties": true },
86
+ "v0": { "type": "string" },
87
+ "v1": { "type": "string" }
88
+ },
89
+ "additionalProperties": false,
90
+ "required": ["id", "v0", "v1"]
91
+ },
92
+ "DirectedEdge": {
93
+ "type": "object",
94
+ "properties": {
95
+ "id": { "type": "string" },
96
+ "attributes": { "type": "object", "additionalProperties": true },
97
+ "edge": { "type": "string" },
98
+ "inverted": { "type": "boolean" }
99
+ },
100
+ "additionalProperties": false,
101
+ "required": ["id", "edge", "inverted"]
102
+ },
103
+ "Wire": {
104
+ "type": "object",
105
+ "properties": {
106
+ "id": { "type": "string" },
107
+ "attributes": { "type": "object", "additionalProperties": true },
108
+ "directed_edges": { "type": "array", "contains": { "type": "string"} }
109
+ },
110
+ "additionalProperties": false,
111
+ "required": ["id", "directed_edges"]
112
+ },
113
+ "Face": {
114
+ "type": "object",
115
+ "properties": {
116
+ "id": { "type": "string" },
117
+ "attributes": { "type": "object", "additionalProperties": true },
118
+ "outer": { "type": "string" },
119
+ "holes": { "type": "array", "contains": { "type": "string"} }
120
+ },
121
+ "additionalProperties": false,
122
+ "required": ["id", "outer", "holes"]
123
+ },
124
+ "Shell": {
125
+ "type": "object",
126
+ "properties": {
127
+ "id": { "type": "string" },
128
+ "attributes": { "type": "object", "additionalProperties": true },
129
+ "faces": { "type": "array", "contains": { "type": "string"} }
130
+ },
131
+ "additionalProperties": false,
132
+ "required": ["id", "faces"]
133
+ }
134
+ }
135
+ }
@@ -0,0 +1,121 @@
1
+ require 'matrix'
2
+
3
+ class Matrix
4
+ def []=(i, j, x)
5
+ @rows[i][j] = x
6
+ end
7
+ end
8
+
9
+ module Topolys
10
+
11
+ # Transformations can be applied to Geometry. Ported from OpenStudio Transformation library.
12
+
13
+ class Transformation
14
+
15
+ # @return [Matrix] internal 4x4 matrix
16
+ attr_reader :matrix
17
+
18
+ ##
19
+ # Initializes an Transformation object
20
+ #
21
+ # @param [Matrix] matrix A 4x4 matrix, defaults to identity
22
+ def initialize(matrix=Matrix.identity(4))
23
+ raise "Incorrect argument for Transformation, expected Matrix but got #{matrix.class}" unless matrix.is_a?(Matrix)
24
+ @matrix = matrix
25
+ end
26
+
27
+ # translation along vector
28
+ def Transformation.translation(translation)
29
+ return nil if !translation.is_a?(Vector3D)
30
+
31
+ matrix = Matrix.identity(4)
32
+ matrix[0,3] = translation.x
33
+ matrix[1,3] = translation.y
34
+ matrix[2,3] = translation.z
35
+
36
+ return Transformation.new(matrix)
37
+ end
38
+
39
+ ##
40
+ # Initializes a rotation about origin defined by axis and angle (radians)
41
+ #
42
+ def Transformation.rotation(axis, radians)
43
+ return nil if !axis.is_a?(Vector3D)
44
+ return nil if !radians.is_a?(Numeric)
45
+ return nil if (axis.magnitude < Float::EPSILON)
46
+ normal = axis
47
+ normal.normalize!
48
+
49
+ # Rodrigues' rotation formula / Rotation matrix from Euler axis/angle
50
+ # I*cos(radians) + I*(1-cos(radians))*axis*axis^T + Q*sin(radians)
51
+ # Q = [0, -axis[2], axis[1]; axis[2], 0, -axis[0]; -axis[1], axis[0], 0]
52
+ p = normal.outer_product(normal)
53
+ i = Matrix.identity(3)
54
+ q = Matrix.zero(3)
55
+ q[0,1] = -normal.z
56
+ q[0,2] = normal.y
57
+ q[1,0] = normal.z
58
+ q[1,2] = -normal.x
59
+ q[2,0] = -normal.y
60
+ q[2,1] = normal.x
61
+
62
+ # rotation matrix
63
+ r = i*Math.cos(radians) + (1-Math.cos(radians))*p + q*Math.sin(radians)
64
+
65
+ matrix = Matrix.identity(4)
66
+ matrix[0,0] = r[0,0]
67
+ matrix[0,1] = r[0,1]
68
+ matrix[0,2] = r[0,2]
69
+ matrix[1,0] = r[1,0]
70
+ matrix[1,1] = r[1,1]
71
+ matrix[1,2] = r[1,2]
72
+ matrix[2,0] = r[2,0]
73
+ matrix[2,1] = r[2,1]
74
+ matrix[2,2] = r[2,2]
75
+
76
+ return Transformation.new(matrix)
77
+ end
78
+
79
+ ##
80
+ # Multiplies a Transformation by geometry class
81
+ #
82
+ # @param [Obj] obj A geometry object
83
+ #
84
+ # @return [Obj] Returns a new, transformed object - nil if not a geometry object
85
+ def *(obj)
86
+ if obj.is_a?(Point3D)
87
+ return mult_point(obj)
88
+ elsif obj.is_a?(Vector3D)
89
+ return mult_vector(obj)
90
+ elsif obj.is_a?(Array)
91
+ return mult_array(obj)
92
+ elsif obj.is_a?(Transformation)
93
+ return mult_transformation(obj)
94
+ end
95
+ return nil
96
+ end
97
+
98
+ private
99
+
100
+ def mult_point(point)
101
+ temp = Matrix.column_vector([point.x, point.y, point.z, 1])
102
+ temp = @matrix*temp
103
+ return Point3D.new(temp[0,0],temp[1,0],temp[2,0])
104
+ end
105
+
106
+ def mult_vector(vector)
107
+ temp = Matrix.column_vector([vector.x, vector.y, vector.z, 1])
108
+ temp = @matrix*temp
109
+ return Vector3D.new(temp[0,0],temp[1,0],temp[2,0])
110
+ end
111
+
112
+ def mult_array(array)
113
+ array.map {|obj| self*obj}
114
+ end
115
+
116
+ def mult_transformation(obj)
117
+ Transformation.new(@matrix * obj.matrix)
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,3 @@
1
+ module Topolys
2
+ VERSION = "0.5.2"
3
+ end
data/lib/topolys.rb ADDED
@@ -0,0 +1,4 @@
1
+ require "topolys/version"
2
+ require "topolys/geometry"
3
+ require "topolys/transformation"
4
+ require "topolys/model"
data/topolys.gemspec ADDED
@@ -0,0 +1,61 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "topolys/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "topolys"
8
+ spec.version = Topolys::VERSION
9
+ spec.authors = ["Dan Macumber & Denis Bourgeois"]
10
+ spec.email = ["dan@automaticmagic.com"]
11
+
12
+ spec.summary = ""
13
+ spec.description = ""
14
+ spec.homepage = "https://github.com/macumber/topolys.git"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the " \
18
+ # 'allowed_push_host'to allow pushing to a single host or delete this section " \
19
+ # to allow pushing to any host.
20
+ #if spec.respond_to?(:metadata)
21
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
22
+
23
+ spec.metadata["homepage_uri"] = spec.homepage
24
+ spec.metadata["source_code_uri"] = "https://github.com/macumber/topolys/tree/v#{spec.version}"
25
+ #spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
26
+ #else
27
+ #raise "RubyGems 2.0 or newer is required to protect against " \
28
+ # "public gem pushes."
29
+ #end
30
+
31
+ # Specify which files should be added to the gem when it is released.
32
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
33
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
34
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
35
+ end
36
+ spec.bindir = "exe"
37
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
38
+ spec.require_paths = ["lib"]
39
+
40
+ if /^2.2/.match(RUBY_VERSION)
41
+ spec.required_ruby_version = "~> 2.2.0"
42
+
43
+ spec.add_development_dependency "public_suffix", "~> 3.1.1"
44
+ spec.add_development_dependency "json-schema", "~> 2.7.0"
45
+ spec.add_development_dependency "bundler", "~> 1.17.1"
46
+ spec.add_development_dependency "rake", "~> 12.3"
47
+ spec.add_development_dependency "rspec", "~> 3.7.0"
48
+ spec.add_development_dependency "rubocop", "~> 0.54.0"
49
+ spec.add_development_dependency "yard", "~> 0.9"
50
+ spec.add_development_dependency "parallel","~> 1.19.2"
51
+
52
+ else
53
+ spec.add_development_dependency "public_suffix", "~> 3.1.1"
54
+ spec.add_development_dependency "json-schema", "~> 2.7.0"
55
+ spec.add_development_dependency "bundler", "~> 2.1"
56
+ spec.add_development_dependency "rake", "~> 13.0"
57
+ spec.add_development_dependency "rspec", "~> 3.9"
58
+ spec.add_development_dependency "rubocop", "~> 0.54.0"
59
+ spec.add_development_dependency "yard", "~> 0.9"
60
+ end
61
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: topolys
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ platform: ruby
6
+ authors:
7
+ - Dan Macumber & Denis Bourgeois
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-07-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: public_suffix
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.1
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: json-schema
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.7.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.7.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '13.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '13.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.9'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.54.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.54.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.9'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.9'
111
+ description: ''
112
+ email:
113
+ - dan@automaticmagic.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitattributes"
119
+ - ".github/workflows/pull_request.yaml"
120
+ - ".gitignore"
121
+ - ".rspec"
122
+ - ".travis.yml"
123
+ - Gemfile
124
+ - LICENSE.md
125
+ - README.md
126
+ - Rakefile
127
+ - bin/console
128
+ - bin/setup
129
+ - design/Classes.pptx
130
+ - lib/topolys.rb
131
+ - lib/topolys/geometry.rb
132
+ - lib/topolys/model.rb
133
+ - lib/topolys/schema/topolys.json
134
+ - lib/topolys/transformation.rb
135
+ - lib/topolys/version.rb
136
+ - topolys.gemspec
137
+ homepage: https://github.com/macumber/topolys.git
138
+ licenses:
139
+ - MIT
140
+ metadata:
141
+ homepage_uri: https://github.com/macumber/topolys.git
142
+ source_code_uri: https://github.com/macumber/topolys/tree/v0.5.2
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubygems_version: 3.1.4
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: ''
162
+ test_files: []