autocad 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|