Expect input coordinates for the mesh projection function to be in world
[blender-addons-contrib.git] / io_vector / import_vecfile.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 """Importing a vector file into Model format.
22 """
23
24 __author__ = "howard.trickey@gmail.com"
25
26 from . import geom
27 from . import model
28 from . import vecfile
29 from . import art2polyarea
30 from . import triquad
31 from . import offset
32 import math
33
34
35 class ImportOptions(object):
36     """Contains options used to control model import.
37
38     Attributes:
39       quadrangulate: bool - should n-gons be quadrangulated?
40       convert_options: art2polyarea.ConvertOptions -
41         options about how to convert vector files into
42         polygonal areas
43       scaled_side_target: float - scale model so that longest side
44         is this length, if > 0.
45       extrude_depth: float - if > 0, extrude polygons up by this amount
46       bevel_amount: float - if > 0, inset polygons by this amount
47       bevel_pitch: float - if > 0, angle in radians of bevel
48       cap_back: bool - should we cap the back, if extruding?
49     """
50
51     def __init__(self):
52         self.quadrangulate = True
53         self.convert_options = art2polyarea.ConvertOptions()
54         self.scaled_side_target = 4.0
55         self.extrude_depth = 0.0
56         self.bevel_amount = 0.0
57         self.bevel_pitch = 45.0 * math.pi / 180.0
58         self.cap_back = False
59
60
61 def ReadVecFileToModel(fname, options):
62     """Read vector art file and convert to Model.
63
64     Args:
65       fname: string - the file to read
66       options: ImportOptions - specifies some choices about import
67     Returns:
68       (Model, string): if there was a major problem, Model may be None.
69         The string will be errors and warnings.
70     """
71
72     art = vecfile.ParseVecFile(fname)
73     if art is None:
74         return (None, "Problem reading file or unhandled type")
75     return ArtToModel(art, options)
76
77
78 def ArtToModel(art, options):
79     """Convert an Art object into a Model object.
80
81     Args:
82       art: geom.Art - the Art object to convert.
83       options: ImportOptions - specifies some choices about import
84     Returns:
85       (geom.Model, string): if there was a major problem, Model may be None.
86         The string will be errors and warnings.
87     """
88
89     pareas = art2polyarea.ArtToPolyAreas(art, options.convert_options)
90     if not pareas:
91         return (None, "No visible faces found")
92     if options.scaled_side_target > 0:
93         pareas.scale_and_center(options.scaled_side_target)
94     m = model.PolyAreasToModel(pareas, options.bevel_amount,
95       options.bevel_pitch, options.quadrangulate)
96     if options.extrude_depth > 0:
97         model.ExtrudePolyAreasInModel(m, pareas, options.extrude_depth,
98           options.cap_back)
99     return (m, "")