autocad 0.4.6
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.
- checksums.yaml +7 -0
- data/.rubocop/minitest.yml +2 -0
- data/.rubocop/strict.yml +4 -0
- data/.rubocop.yml +33 -0
- data/.solargraph.yml +22 -0
- data/.vscode/launch.json +30 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/Guardfile +66 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +10 -0
- data/Steepfile +35 -0
- data/WASD-D-TDS-C001.dwg +0 -0
- data/WASD-D-TDS-C001.pdf +0 -0
- data/autocad.log +1 -0
- data/autocad_example.rb +26 -0
- data/event_handler.log +24 -0
- data/examples/example_save_pdf.rb +5 -0
- data/exe/autocad +3 -0
- data/exe/dgn2pdf +50 -0
- data/exe/pw_print +43 -0
- data/gemfiles/rubocop.gemfile +6 -0
- data/lib/autocad/app.rb +655 -0
- data/lib/autocad/arc.rb +29 -0
- data/lib/autocad/block.rb +141 -0
- data/lib/autocad/block_reference.rb +198 -0
- data/lib/autocad/drawing.rb +426 -0
- data/lib/autocad/element.rb +454 -0
- data/lib/autocad/enumerator.rb +24 -0
- data/lib/autocad/errors.rb +37 -0
- data/lib/autocad/event_handler.rb +30 -0
- data/lib/autocad/filter.rb +168 -0
- data/lib/autocad/layer.rb +41 -0
- data/lib/autocad/line.rb +55 -0
- data/lib/autocad/message_box.rb +95 -0
- data/lib/autocad/model.rb +89 -0
- data/lib/autocad/mtext.rb +110 -0
- data/lib/autocad/paths.rb +29 -0
- data/lib/autocad/point3d.rb +143 -0
- data/lib/autocad/pviewport.rb +21 -0
- data/lib/autocad/selection_filter.rb +180 -0
- data/lib/autocad/selection_set.rb +61 -0
- data/lib/autocad/selection_set_adapter.rb +146 -0
- data/lib/autocad/text.rb +74 -0
- data/lib/autocad/version.rb +5 -0
- data/lib/autocad.rb +161 -0
- data/olegen.rb +341 -0
- data/rbs_collection.lock.yaml +188 -0
- data/rbs_collection.yaml +19 -0
- data/scanner.obj +0 -0
- data/sig/generated/autocad/app.rbs +251 -0
- data/sig/generated/autocad/arc.rbs +17 -0
- data/sig/generated/autocad/block.rbs +63 -0
- data/sig/generated/autocad/block_reference.rbs +59 -0
- data/sig/generated/autocad/drawing.rbs +158 -0
- data/sig/generated/autocad/element.rbs +166 -0
- data/sig/generated/autocad/enumerator.rbs +15 -0
- data/sig/generated/autocad/errors.rbs +23 -0
- data/sig/generated/autocad/event_handler.rbs +14 -0
- data/sig/generated/autocad/filter.rbs +60 -0
- data/sig/generated/autocad/layer.rbs +19 -0
- data/sig/generated/autocad/line.rbs +25 -0
- data/sig/generated/autocad/message_box.rbs +81 -0
- data/sig/generated/autocad/model.rbs +41 -0
- data/sig/generated/autocad/paths.rbs +19 -0
- data/sig/generated/autocad/point3d.rbs +66 -0
- data/sig/generated/autocad/selection_filter.rbs +50 -0
- data/sig/generated/autocad/selection_set.rbs +37 -0
- data/sig/generated/autocad/selection_set_adapter.rbs +28 -0
- data/sig/generated/autocad/text.rbs +19 -0
- data/sig/generated/autocad/text_node.rbs +37 -0
- data/sig/generated/autocad/version.rbs +5 -0
- data/sig/generated/autocad/viewport.rbs +11 -0
- data/sig/generated/autocad.rbs +68 -0
- data/sig/prototype/lib/autocad/app.rbs +34 -0
- data/sig/prototype/lib/autocad/block.rbs +5 -0
- data/sig/prototype/lib/autocad/block_reference.rbs +5 -0
- data/sig/prototype/lib/autocad/drawing.rbs +13 -0
- data/sig/prototype/lib/autocad/element.rbs +9 -0
- data/sig/prototype/lib/autocad/enumerator.rbs +5 -0
- data/sig/prototype/lib/autocad/event_handler.rbs +7 -0
- data/sig/prototype/lib/autocad/model.rbs +5 -0
- data/sig/prototype/lib/autocad/paths.rbs +5 -0
- data/sig/prototype/lib/autocad.rbs +3 -0
- data/temp/autocad.dwg +0 -0
- data/temp/autocad.log +1 -0
- data/temp/event_handler.log +0 -0
- metadata +147 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
module Autocad
|
2
|
+
class Layer < Element
|
3
|
+
def name
|
4
|
+
ole_obj.name
|
5
|
+
end
|
6
|
+
|
7
|
+
def description
|
8
|
+
ole_obj.description
|
9
|
+
end
|
10
|
+
|
11
|
+
def lock(lk = true)
|
12
|
+
ole_obj.Lock = lk
|
13
|
+
rescue
|
14
|
+
raise Autocad::Error.new("Error locking layer #{name}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def visible?
|
18
|
+
ole_obj.Visible
|
19
|
+
end
|
20
|
+
|
21
|
+
def visible=(vis)
|
22
|
+
ole_obj.Visible = vis
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete
|
26
|
+
ole_obj.Delete
|
27
|
+
rescue => e
|
28
|
+
raise Autocad::Error.new("Error deleting layer #{name} #{e}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def linetype=(ltname)
|
32
|
+
found_lt = app.current_drawing.linetypes.find { |lt| lt.name == ltname }
|
33
|
+
|
34
|
+
app.current_drawing.ole_obj.Linetypes.Load(ltname, ltname) unless found_lt
|
35
|
+
|
36
|
+
ole_obj.Linetype = ltname
|
37
|
+
rescue => e
|
38
|
+
raise Autocad::Error.new("Error setting linetype of layer #{name} : #{e}")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/autocad/line.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# rbs_inline: enabled
|
2
|
+
|
3
|
+
require_relative 'element'
|
4
|
+
|
5
|
+
module Autocad
|
6
|
+
class Line < Element
|
7
|
+
def length
|
8
|
+
ole_obj.length
|
9
|
+
end
|
10
|
+
|
11
|
+
def line?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
def start_point # : Point3d
|
16
|
+
Point3d(ole_obj.StartPoint)
|
17
|
+
end
|
18
|
+
|
19
|
+
def end_point # : Point3d
|
20
|
+
Point3d(ole_obj.EndPoint)
|
21
|
+
end
|
22
|
+
|
23
|
+
def normal
|
24
|
+
ole_obj.Normal
|
25
|
+
end
|
26
|
+
|
27
|
+
def thickness
|
28
|
+
ole_obj.Thickness
|
29
|
+
end
|
30
|
+
|
31
|
+
def delta
|
32
|
+
ole_obj.Delta
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Circle < Element
|
37
|
+
def center
|
38
|
+
Point3d.new(ole_obj.Center)
|
39
|
+
end
|
40
|
+
|
41
|
+
def radius
|
42
|
+
Point3d.new(ole_obj.Radius)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class Polyline < Element
|
47
|
+
def length
|
48
|
+
@ole_obj.Length
|
49
|
+
end
|
50
|
+
|
51
|
+
def coordinates
|
52
|
+
@ole_obj.coordinates
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require "fiddle/import"
|
2
|
+
require "fiddle/types"
|
3
|
+
|
4
|
+
module WinAPI
|
5
|
+
extend Fiddle::Importer
|
6
|
+
dlload "user32.dll"
|
7
|
+
include Fiddle::BasicTypes
|
8
|
+
include Fiddle::Win32Types
|
9
|
+
|
10
|
+
typealias "LPCWSTR", "wchar_t*"
|
11
|
+
|
12
|
+
extern "int MessageBoxA(HWND, LPCSTR, LPCSTR, DWORD)"
|
13
|
+
extern "int MessageBoxW(HWND, LPCWSTR, LPCWSTR, DWORD)"
|
14
|
+
# window handling
|
15
|
+
extern "HWND GetForegroundWindow()"
|
16
|
+
extern "int GetWindowText(HWND, char*, int)"
|
17
|
+
extern "int GetWindowTextLength(HWND)"
|
18
|
+
|
19
|
+
def get_foreground_window
|
20
|
+
GetForegroundWindow()
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.get_text_of_active_window
|
24
|
+
hwnd = GetForegroundWindow()
|
25
|
+
buf_size = GetWindowTextLength(hwnd)
|
26
|
+
str = " " * (buf_size + 1)
|
27
|
+
GetWindowText(hwnd, str, str.length)
|
28
|
+
str.encode(Encoding.default_external)
|
29
|
+
end
|
30
|
+
|
31
|
+
module MB
|
32
|
+
OK = 1
|
33
|
+
CANCEL = 1
|
34
|
+
ABORT = 3
|
35
|
+
RETRY = 4
|
36
|
+
IGNORE = 5
|
37
|
+
YES = 6
|
38
|
+
NO = 7
|
39
|
+
|
40
|
+
module ICON
|
41
|
+
ERROR = 16
|
42
|
+
QUESTION = 32
|
43
|
+
INFORMATION = 64
|
44
|
+
WARNING = 128
|
45
|
+
end
|
46
|
+
|
47
|
+
module BTN
|
48
|
+
OK = 0
|
49
|
+
OKCANCEL = 1
|
50
|
+
ABORTRETRYIGNORE = 2
|
51
|
+
YESNO = 4
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# msgbox_yesno('Do you want to continue?') do |y|
|
57
|
+
# if y
|
58
|
+
# puts 'proceeding with ...'
|
59
|
+
# else
|
60
|
+
# puts 'cancelled ...'
|
61
|
+
# end
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# msgbox('We are finished here')
|
65
|
+
#
|
66
|
+
# loop do
|
67
|
+
# puts WinAPI.get_text_of_active_window
|
68
|
+
# sleep 1
|
69
|
+
# end
|
70
|
+
module Kernel
|
71
|
+
module_function
|
72
|
+
|
73
|
+
# @rbs str: String
|
74
|
+
# @rbs return String
|
75
|
+
def L(str)
|
76
|
+
str.encode("UTF-16LE")
|
77
|
+
end
|
78
|
+
|
79
|
+
# @example
|
80
|
+
# msg_box_yesno("Do you want to continue") do |y|
|
81
|
+
# if y
|
82
|
+
# puts "proceeding"
|
83
|
+
# else
|
84
|
+
# puts "cancelled"
|
85
|
+
# end
|
86
|
+
# end
|
87
|
+
def msgbox_yesno(content, title: "Alert")
|
88
|
+
result = WinAPI::MessageBoxW(0, L(content), L(title), WinAPI::MB::BTN::YESNO) == WinAPI::MB::YES
|
89
|
+
yield(result)
|
90
|
+
end
|
91
|
+
|
92
|
+
def msgbox(content, title: "Alert")
|
93
|
+
WinAPI::MessageBoxW(0, L(content), L(title), WinAPI::MB::BTN::OK)
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# require_relative 'scan/scan_trait'
|
2
|
+
# require_relative "model_trait"
|
3
|
+
|
4
|
+
# require_relative 'ts/tagset_trait'
|
5
|
+
# require_relative 'graphics'
|
6
|
+
# require_relative 'ts/instance'
|
7
|
+
|
8
|
+
module Autocad
|
9
|
+
module ModelTrait
|
10
|
+
def each
|
11
|
+
return enum_for(:each) unless block_given?
|
12
|
+
|
13
|
+
@ole_obj.each do |ole|
|
14
|
+
yield app.wrap(ole)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# @rbs pt1: Autocad::Point3d
|
19
|
+
# @rbs return Autocad::Line
|
20
|
+
def add_line(pt1, pt2, layer: nil)
|
21
|
+
pt1 = Point3d.new(pt1)
|
22
|
+
pt2 = Point3d.new(pt2)
|
23
|
+
ole_line = ole_obj.AddLine(pt1.to_ole, pt2.to_ole)
|
24
|
+
if layer
|
25
|
+
layer = app.create_layer(layer)
|
26
|
+
ole_line.layer = layer.ole_obj
|
27
|
+
end
|
28
|
+
app.wrap(ole_line)
|
29
|
+
rescue ex
|
30
|
+
puts ex.message
|
31
|
+
end
|
32
|
+
|
33
|
+
# @rbs center: [] | Point3d -- center of circle
|
34
|
+
# @rbs radius:
|
35
|
+
def add_circle(center, radius)
|
36
|
+
pt = Point3d(center)
|
37
|
+
ole_circle = ole_obj.AddCircle(pt.to_ole, radius)
|
38
|
+
app.wrap(ole_circle)
|
39
|
+
rescue
|
40
|
+
raise Autocad::Error.new('Error adding circle #{ex}')
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_rectangle(upper_left, lower_right)
|
44
|
+
x1, y1, _z = Point3d(upper_left).to_a
|
45
|
+
x2, y2, _z2 = Point3d(lower_right)
|
46
|
+
pts = [x1, y1, x2, y1, x2, y1, x2, y2]
|
47
|
+
pts_variant = WIN32OLE::Variant.new(pts, WIN32OLE::VARIANT::VT_ARRAY | WIN32OLE::VARIANT::VT_R8)
|
48
|
+
ole = ole_obj.AddLightweightPolyline(pts_variant)
|
49
|
+
app.wrap(ole)
|
50
|
+
rescue => e
|
51
|
+
raise Autocad::Error.new("Error adding rectangle #{e}")
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_spline(points)
|
55
|
+
pts = Point3d.pts_to_array(points)
|
56
|
+
pts_variant = Point3d.array_to_ole(pts)
|
57
|
+
ole = ole_obj.AddSpline(pts_variant)
|
58
|
+
puts "pts #{pts}"
|
59
|
+
puts "pts_variant #{pts_variant.class} #{pts_variant}"
|
60
|
+
app.wrap(ole)
|
61
|
+
rescue => e
|
62
|
+
raise Autocad::Error.new("Error adding spline #{e}")
|
63
|
+
end
|
64
|
+
|
65
|
+
def drawing
|
66
|
+
@drawing ||= ::Autocad::Drawing.from_ole_obj(app, ole_obj.Document)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class PaperSpace
|
71
|
+
include ModelTrait
|
72
|
+
attr_reader :app, :ole_obj
|
73
|
+
|
74
|
+
def initialize(ole, app)
|
75
|
+
@ole_obj = ole
|
76
|
+
@app = app
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class ModelSpace
|
81
|
+
include ModelTrait
|
82
|
+
attr_reader :app, :ole_obj
|
83
|
+
|
84
|
+
def initialize(ole, app)
|
85
|
+
@ole_obj = ole
|
86
|
+
@app = app
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Autocad
|
2
|
+
class MText < Element
|
3
|
+
attr_reader :original, :ole_obj
|
4
|
+
|
5
|
+
def to_regexp
|
6
|
+
Regexp.new(original.to_s)
|
7
|
+
end
|
8
|
+
|
9
|
+
def empty?
|
10
|
+
ole_obj.TextLinesCount == 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def mtext?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def text?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def size
|
22
|
+
ole_obj.TextLinesCount
|
23
|
+
end
|
24
|
+
|
25
|
+
def read_ole(ole)
|
26
|
+
ole.TextString
|
27
|
+
end
|
28
|
+
|
29
|
+
# def _update(text)
|
30
|
+
# update_ole!(text)
|
31
|
+
# @original = text
|
32
|
+
# end
|
33
|
+
|
34
|
+
def write_ole(text)
|
35
|
+
if in_cell?
|
36
|
+
write_ole_in_cell(text)
|
37
|
+
else
|
38
|
+
write_ole_regular(text)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def write_ole_regular(text)
|
43
|
+
ole_obj.TextString = text
|
44
|
+
end
|
45
|
+
|
46
|
+
def write_ole_in_cell(text)
|
47
|
+
orig_ole = ole_obj
|
48
|
+
new_text_ole = ole_obj.Clone
|
49
|
+
new_text_ole.DeleteAllTextLines
|
50
|
+
text.each_line do |line|
|
51
|
+
new_text_ole.AddTextLine(line)
|
52
|
+
end
|
53
|
+
@ole_obj = new_text_ole
|
54
|
+
rescue
|
55
|
+
@ole_obj = orig_ole
|
56
|
+
end
|
57
|
+
|
58
|
+
def update_ole!(text)
|
59
|
+
ole_obj.DeleteAllTextLines
|
60
|
+
text.each_line do |line|
|
61
|
+
ole_obj.AddTextLine(line)
|
62
|
+
end
|
63
|
+
ole_obj.Redraw Autocad::MSD::MsdDrawingModeNormal
|
64
|
+
ole_obj.Rewrite
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_s
|
68
|
+
@original.to_s
|
69
|
+
end
|
70
|
+
|
71
|
+
def =~(reg)
|
72
|
+
@original =~ reg
|
73
|
+
end
|
74
|
+
|
75
|
+
def template?
|
76
|
+
!!(@original =~ /{{.+}}/)
|
77
|
+
end
|
78
|
+
|
79
|
+
def render(h = {})
|
80
|
+
return self unless template?
|
81
|
+
|
82
|
+
template = Liquid::Template.parse(to_s)
|
83
|
+
result = template.render(h)
|
84
|
+
update(result) unless result == @original
|
85
|
+
self
|
86
|
+
end
|
87
|
+
|
88
|
+
def method_missing(meth, *, &)
|
89
|
+
if /^[A-Z]/.match?(meth)
|
90
|
+
ole_obj.send(meth, *)
|
91
|
+
else
|
92
|
+
copy = @original.dup
|
93
|
+
result = copy.send(meth, *, &)
|
94
|
+
update(result) unless copy == @original
|
95
|
+
result
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# def method_missing2(meth,*args,&block)
|
100
|
+
# if meth.to_s =~ /^[A-Z]/
|
101
|
+
# ole_obj.send(meth,*args)
|
102
|
+
# else
|
103
|
+
# dup = @original.dup
|
104
|
+
# result = dup.send(meth,*args,&block)
|
105
|
+
# _update(dup) unless dup == @original
|
106
|
+
# result
|
107
|
+
# end
|
108
|
+
# end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Autocad
|
2
|
+
class Paths
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(path)
|
6
|
+
@paths = path.split(";").map { |p| Pathname(p) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def <<(path)
|
10
|
+
@paths << Path(path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def append(path)
|
14
|
+
@paths.append Path(path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def prepend(path)
|
18
|
+
paths.prepend Path(path)
|
19
|
+
end
|
20
|
+
|
21
|
+
def each(...)
|
22
|
+
paths.each(...)
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
parhs.join(";")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# rbs_inline: enabled
|
2
|
+
|
3
|
+
module Autocad
|
4
|
+
class Point3d
|
5
|
+
class << self
|
6
|
+
def cartesian_to_polar(x, y)
|
7
|
+
r = Math.sqrt(x * x + y * y)
|
8
|
+
angle = Angle.radians(Math.atan2(y, x))
|
9
|
+
[r, angle]
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_polar_degrees(r, a)
|
13
|
+
end
|
14
|
+
|
15
|
+
def from_ole(ole)
|
16
|
+
new(ole.X, ole.Y, ole.Z)
|
17
|
+
end
|
18
|
+
|
19
|
+
def polar_to_cartesian(r, a)
|
20
|
+
end
|
21
|
+
|
22
|
+
# convert array of points to array of x,y coordinates
|
23
|
+
# array can be [ Point3d, Point3d, ..]
|
24
|
+
# array can be [ [x,y,z], [x,y,z], [x,y,z] ..]
|
25
|
+
# array can be [x,y, x1, y1, x2,y2, x3,y3]
|
26
|
+
# array can be [[x,y], [x2,y2], [x3,y3]]
|
27
|
+
# all coordinates are converted to float
|
28
|
+
# z coordinates are ignored
|
29
|
+
# @rbs return Array[Float]
|
30
|
+
def pts_to_array(pts)
|
31
|
+
case pts.first
|
32
|
+
when Point3d
|
33
|
+
pts.flat_map(&:to_xy)
|
34
|
+
when Array
|
35
|
+
pts.flat_map { |pt| [pt[0].to_f, pt[1].to_f] }
|
36
|
+
when Numeric
|
37
|
+
pts.each_slice(2).flat_map { |x, y| [x.to_f, y.to_f] }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def array_to_ole(ar)
|
42
|
+
WIN32OLE::Variant.new(ar, WIN32OLE::VARIANT::VT_ARRAY | WIN32OLE::VARIANT::VT_R8)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
attr_reader :x, :y, :z
|
47
|
+
|
48
|
+
def initialize(_x = nil, _y = nil, _z = nil, x: _x, y: _y, z: _z)
|
49
|
+
case [x, y, z]
|
50
|
+
in [Point3d, y, z]
|
51
|
+
@x = x.x
|
52
|
+
@y = x.y
|
53
|
+
@z = x.z
|
54
|
+
in [Array, nil, nil]
|
55
|
+
@x = x[0].to_f
|
56
|
+
@y = x[1].to_f
|
57
|
+
@z = x[2].to_f
|
58
|
+
in [Float, Float, Float]
|
59
|
+
@x = x
|
60
|
+
@y = y
|
61
|
+
@z = z
|
62
|
+
else
|
63
|
+
@x = x.to_f || 0.0
|
64
|
+
@y = y.to_f || 0.0
|
65
|
+
@z = z.to_f || 0.0
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# @rbs other: Point3d | [Float,Float,Float]
|
70
|
+
def +(other) # : Point3d
|
71
|
+
case other
|
72
|
+
when Point3d
|
73
|
+
self.class.new(x + other.x, y + other.y, z + other.z)
|
74
|
+
when Array
|
75
|
+
self.class.new(x + other[0], y + other[1])
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def distance_to(other)
|
80
|
+
pt2 = Point3d.new(other)
|
81
|
+
Math.sqrt((x - pt2.x)**2 + (y - pt2.y)**2 + (z - pt2.z)**2)
|
82
|
+
end
|
83
|
+
|
84
|
+
# @rbs return [Float,Float, Float]
|
85
|
+
def deconstruct
|
86
|
+
[@x, @y, @z]
|
87
|
+
end
|
88
|
+
|
89
|
+
# @rbs return { x: Float, y: Float, z: Float}
|
90
|
+
def deconstruct_keys
|
91
|
+
{x: @x, y: @y, z: @z}
|
92
|
+
end
|
93
|
+
|
94
|
+
# @rbs return [Float,Float, Float]
|
95
|
+
def to_ary
|
96
|
+
[x, y, z]
|
97
|
+
end
|
98
|
+
|
99
|
+
# @rbs other: Point3d | [Float,Float,Float]
|
100
|
+
def -(other) # : Point3d
|
101
|
+
case other
|
102
|
+
when Point3d
|
103
|
+
self.class.new(x - other.x, y - other.y, z - other.z)
|
104
|
+
when Array
|
105
|
+
self.class.new(x - other[0], y - other[1])
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def to_xy
|
110
|
+
[x, y]
|
111
|
+
end
|
112
|
+
|
113
|
+
def xy_bounds(other)
|
114
|
+
x2, y2 = Points3d.new(other).to_xy
|
115
|
+
[x, y, x2, y, x2, y2, x, y2, x, y]
|
116
|
+
end
|
117
|
+
|
118
|
+
def to_s
|
119
|
+
"Point3d(#{x}, #{y}, #{z})"
|
120
|
+
end
|
121
|
+
|
122
|
+
# @rbs return [Float,Float, Float]
|
123
|
+
def to_a
|
124
|
+
[x, y, z]
|
125
|
+
end
|
126
|
+
|
127
|
+
# @rbs return Point3d -- return a Point3d at [0,0,0]
|
128
|
+
def zero
|
129
|
+
new(0.0, 0.0, 0, 0)
|
130
|
+
end
|
131
|
+
|
132
|
+
def to_cartesian
|
133
|
+
end
|
134
|
+
|
135
|
+
def to_ole
|
136
|
+
ole = WIN32OLE::Variant.array([3], WIN32OLE::VARIANT::VT_R8)
|
137
|
+
ole[0] = x
|
138
|
+
ole[1] = y
|
139
|
+
ole[z] = z
|
140
|
+
ole
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "element"
|
2
|
+
|
3
|
+
module Autocad
|
4
|
+
class PViewport < Element
|
5
|
+
def width
|
6
|
+
@ole_obj.Width
|
7
|
+
end
|
8
|
+
|
9
|
+
def height
|
10
|
+
@ole_obj.Height
|
11
|
+
end
|
12
|
+
|
13
|
+
def each
|
14
|
+
return enum_for(:each) unless block_given?
|
15
|
+
|
16
|
+
@ole_obj.each do |ole|
|
17
|
+
yield app.wrap(ole)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|