File Coverage

blib/lib/CAD/Drawing/Defined.pm
Criterion Covered Total %
statement 12 65 18.4
branch 0 20 0.0
condition n/a
subroutine 4 8 50.0
pod 4 4 100.0
total 20 97 20.6


line stmt bran cond sub pod time code
1             package CAD::Drawing::Defined;
2             our $VERSION = '0.62';
3              
4 3     3   75 use warnings;
  3         6  
  3         84  
5 3     3   15 use strict;
  3         6  
  3         84  
6 3     3   15 use Carp;
  3         6  
  3         222  
7 3         7687 use vars qw(
8             @ISA
9             @EXPORT
10             $debug
11             $linkdebug
12             $loaddebug
13             $colordebug
14             %color_names
15             %call_syntax
16             %ac_storage_method
17             %defaults
18             @defaultkeys
19             @std_opts_syntax
20             $pi
21             @aci2hex
22             @aci2rgb
23 3     3   16 );
  3         6  
24              
25             require Exporter;
26             @ISA = qw(Exporter);
27             @EXPORT = qw(
28             $debug
29             $linkdebug
30             $loaddebug
31             $colordebug
32             %color_names
33             %call_syntax
34             %ac_storage_method
35             %defaults
36             @defaultkeys
37             @std_opts_syntax
38             $pi
39             @aci2hex
40             @aci2rgb
41             check_select
42             color_translate
43             checkarcangs
44             );
45             # @EXPORT_OK = qw(
46             # color_translate
47             # );
48             $debug = 0;
49             $linkdebug = 0;
50             $colordebug = 0;
51             $loaddebug = 0;
52              
53             %defaults = (
54             "layer" => "0",
55             "color" => 256,
56             "linetype" => "default",
57             );
58              
59             @defaultkeys = keys(%defaults);
60              
61             ########################################################################
62             =head1 NAME
63              
64             CAD::Drawing::Defined - exported constants for CAD::Drawing::*
65              
66             =head1 Description
67              
68             Everything in this module is exported by default. This module is not
69             intended to be used directly, but is required by each module in the
70             CAD::Drawing tree.
71              
72             =head1 AUTHOR
73              
74             Eric L. Wilhelm
75              
76             http://scratchcomputing.com
77              
78             =head1 COPYRIGHT
79              
80             This module is copyright (C) 2004-2006 by Eric L. Wilhelm. Portions
81             copyright (C) 2003 by Eric L. Wilhelm and A. Zahner Co.
82              
83             =head1 LICENSE
84              
85             This module is distributed under the same terms as Perl. See the Perl
86             source package for details.
87              
88             You may use this software under one of the following licenses:
89              
90             (1) GNU General Public License
91             (found at http://www.gnu.org/copyleft/gpl.html)
92             (2) Artistic License
93             (found at http://www.perl.com/pub/language/misc/Artistic.html)
94              
95             =head1 NO WARRANTY
96              
97             This software is distributed with ABSOLUTELY NO WARRANTY. The author,
98             his former employer, and any other contributors will in no way be held
99             liable for any loss or damages resulting from its use.
100              
101             =head1 Modifications
102              
103             The source code of this module is made freely available and
104             distributable under the GPL or Artistic License. Modifications to and
105             use of this software must adhere to one of these licenses. Changes to
106             the code should be noted as such and this notification (as well as the
107             above copyright information) must remain intact on all copies of the
108             code.
109              
110             Additionally, while the author is actively developing this code,
111             notification of any intended changes or extensions would be most helpful
112             in avoiding repeated work for all parties involved. Please contact the
113             author with any such development plans.
114              
115             =cut
116             ########################################################################
117              
118             =head1 Useful Functions
119              
120             These were functions that didn't seem appropriate as object-oriented but
121             were needed in multiple places. They are exported by default (as is
122             nearly everything in this package.
123              
124             =cut
125             ########################################################################
126              
127             =head2 check_select
128              
129             Provides a uniform interface to selection processing.
130              
131             NOTE: this is not an object method and is exported by default!
132              
133             Direct calling should be for internal use only, but you may have been
134             sent to this documentation by one of the modules which uses this
135             function to process %option arguments.
136              
137             %opts hash may contain (alias)
138              
139             Inclusive lists:
140             "select layers" (sl)
141             "select colors" (sc)
142             "select types" (st)
143             "select linetypes" (slt)
144              
145             Exclusive lists:
146             "not layers" (nl)
147             "not colors" (nc)
148             "not types" (nt)
149             "not linetypes" (nlt)
150              
151             The values must be list references.
152              
153             The space-separated terms in the keys above may now be underscore ("_")
154             separated as well (this saves having to double-quote the item when using
155             it as a hash key in the %options argument.)
156              
157             If an option is omitted, all of that category are selected.
158              
159             ($s, $n) = check_select(\%selection_options);
160              
161             $s will be a hash reference to inclusive items
162             $n will be a hash reference to excluded items
163              
164             Keys in the returned hash references are according to the above-listed
165             alias conventions ($s->{l} contains a set of true values for selected
166             layers (where the layer name is a string acting as the hash key.))
167              
168             Note that the \%selection_options hash reference is a required argument
169             (at this level.) Any functions which make it optional must declare a
170             hash before passing to this.
171              
172             =cut
173             sub check_select {
174 0     0 1   my ($opt) = @_;
175 0           my %opts = %$opt;
176 0           my %s = (
177             "l" => undef(),
178             "c" => undef(),
179             "t" => undef(),
180             "lt" => undef(),
181             );
182 0           my %n = (
183             "l" => undef(),
184             "c" => undef(),
185             "t" => undef(),
186             "lt" => undef(),
187             );
188 0           my %res = ( "s" => \%s, "n" => \%n);
189 0           my @choices = keys(%res);
190 0           my %mapch = (
191             "s" => "select",
192             "n" => "not",
193             );
194 0           my %mapit = (
195             "l" => "layers",
196             "c" => "colors",
197             "t" => "types",
198             "lt" => "linetypes",
199             );
200             # $opts{sl} && print "wanted @{$opts{sl}}\n";
201 0           foreach my $ch (@choices) {
202 0           my $g = $res{$ch};
203 0           foreach my $it (keys(%{$g})) {
  0            
204 0           foreach my $alias ($ch . $it, $mapch{$ch}."_".$mapit{$it}) {
205 0 0         $opts{$alias} &&
206             ($opts{"$mapch{$ch} $mapit{$it}"} = $opts{$ch.$it});
207             # print "option $alias: $opts{$alias}\n";
208             }
209 0 0         if($opts{"$mapch{$ch} $mapit{$it}"}) {
210             # print "$mapch{$ch} $mapit{$it}\n";
211 0           my @list = @{$opts{"$mapch{$ch} $mapit{$it}"}};
  0            
212 0 0         ($it eq "c") && (@list = color_translate(@list));
213             # print "($it) list: @list\n";
214 0           $g->{$it} = {map({$_ => 1} @list)};
  0            
215             }
216             else {
217 0           $g->{$it} = undef;
218             }
219             }
220             }
221 0           return(\%s, \%n);
222              
223             } # end subroutine check_select definition
224             ########################################################################
225              
226             =head2 checkarcangs
227              
228             Performs in-place modification of arc angles in \@angs.
229              
230             NOTE: this is not an object method and is exported by default!
231              
232             Internal use only.
233              
234             checkarcangs(\@angs);
235              
236             =cut
237             sub checkarcangs {
238 0     0 1   my($ang) = @_;
239 0           foreach my $d (0,1) {
240             # print "got $$ang[$d] for an angle\n";
241 0 0         if($$ang[$d] =~ s/d$//) {
242             # allow spec of angle in degrees with $angle . "d";
243 0           $$ang[$d] *= $pi / 180;
244             }
245 0           while($$ang[$d] > $pi) {
246 0           $$ang[$d] -= $pi * 2;
247             }
248 0           while($$ang[$d] <= -$pi) {
249 0           $$ang[$d] += $pi * 2;
250             }
251             }
252             } # end subroutine checkarcangs definition
253             ########################################################################
254              
255             =head2 color_translate
256              
257             Translates a list of colors into numbers. Numbers will be passed
258             through (as will unrecognized names!)
259              
260             @colors = color_translate(@colors);
261              
262             =cut
263             sub color_translate {
264 0     0 1   my(@list) = @_;
265 0           foreach my $item (@list) {
266 0 0         $linkdebug && print "got color for $item: $color_names{$item}\n";
267 0 0         ( defined($color_names{$item}) ) && ($item = $color_names{$item} );
268 0 0         ($item == int($item) ) or carp("don't know what to do with color: $item\n");
269             }
270 0 0         $#list || return($list[0]);
271 0           return(@list);
272              
273             } # end subroutine color_translate definition
274             ########################################################################
275              
276             =head1 Various definitions
277              
278             =head2 %color_names
279              
280             Useful for humans. Currently, these have to be statically defined here.
281             A better system might allow more spellings and user-defined names (maybe
282             loadable from a file.)
283              
284             =cut
285              
286             %color_names = (
287             "byblock" => 0,
288             "by block" => 0,
289             "bylayer" => 256,
290             "by layer" => 256,
291             "red" => 1,
292             "yellow" => 2,
293             "green" => 3,
294             "cyan" => 4,
295             "blue" => 5,
296             "magenta" => 6,
297             "black" => 7,
298             "darkgray" => 8,
299             "darkgrey" => 8,
300             "lightgray" => 9,
301             "lightgrey" => 9,
302             "charcoal" => 250,
303             "white" => 255,
304             );
305             ########################################################################
306             # call syntax for add functions
307             # list only the non-standard options (as keys per the data-structure syntax)
308             # FIXME: need to define what is required separately from what is in the hash?
309             =head2 %call_syntax
310              
311             used to allow other functions to decide how to handle various entities
312              
313             =cut
314             %call_syntax = (
315             "plines" => [\&CAD::Drawing::addpolygon, "pts"],
316             "lines" => [\&CAD::Drawing::addline, "pts"],
317             "texts" => [\&CAD::Drawing::addtext, "pt", "string"],
318             "points" => [\&CAD::Drawing::addpoint, "pt"],
319             "circles" => [\&CAD::Drawing::addcircle, "pt", "rad"],
320             "arcs" => [\&CAD::Drawing::addarc, "pt", "rad", "angs"],
321             "images" => [\&CAD::Drawing::addimage, "pt"],
322             );
323             #"
324              
325             %ac_storage_method = (
326             plines => "ocs",
327             lines => "wcs",
328             texts => "ocs",
329             circles => "ocs",
330             arcs => "ocs",
331             points => "wcs",
332             );
333             #"
334             ########################################################################
335             $pi = atan2(1,1) * 4;
336              
337             ########################################################################
338             =head1 Big Constant arrays
339              
340             =head2 @aci2hex
341              
342             256 value array which contains #RRGGBB photo-style hex codes for each
343             aci color. This is mostly hand-mapped.
344              
345             =cut
346              
347             @aci2hex = (
348             "#FFFFFF", "#ff0000", "#ffff00", "#00ff00", # 0 - 3
349             "#00ffff", "#0000ff", "#ff00ff", "#ffffff", # 4 - 7
350             "#b2b2b2", "#c0c0c0", "#ff0000", "#ff8080", # 8 - 11
351             "#a60000", "#a65353", "#800000", "#804040", # 12 - 15
352             "#4c0000", "#4c2626", "#260000", "#261313", # 16 - 19
353             "#ff4000", "#ff9f80", "#a62900", "#a66853", # 20 - 23
354             "#802000", "#805040", "#4c1300", "#4c3026", # 24 - 27
355             "#260a00", "#261813", "#ff8000", "#ffbf80", # 28 - 31
356             "#a65300", "#a67c53", "#804000", "#806040", # 32 - 35
357             "#4c2600", "#4c3926", "#261300", "#261d13", # 36 - 39
358             "#ffbf00", "#ffdf80", "#a67c00", "#a69153", # 40 - 43
359             "#806000", "#807040", "#4c3900", "#4c4326", # 44 - 47
360             "#261d00", "#262113", "#ffff00", "#ffff80", # 48 - 51
361             "#a6a600", "#a6a653", "#808000", "#808040", # 52 - 55
362             "#4c4c00", "#4c4c26", "#262600", "#262613", # 56 - 59
363             "#bfff00", "#dfff80", "#7ca600", "#91a653", # 60 - 63
364             "#608000", "#708040", "#394c00", "#434c26", # 64 - 67
365             "#1d2600", "#212613", "#80ff00", "#bfff80", # 68 - 71
366             "#53a600", "#7ca653", "#408000", "#608040", # 72 - 75
367             "#264c00", "#394c26", "#132600", "#1d2613", # 76 - 79
368             "#40ff00", "#9fff80", "#29a600", "#68a653", # 80 - 83
369             "#208000", "#508040", "#134c00", "#304c26", # 84 - 87
370             "#0a2600", "#182613", "#00ff00", "#80ff80", # 88 - 91
371             "#00a600", "#53a653", "#008000", "#408040", # 92 - 95
372             "#004c00", "#264c26", "#002600", "#132613", # 96 - 99
373             "#00ff40", "#80ff9f", "#00a629", "#53a668", # 100 - 103
374             "#008020", "#408050", "#004c13", "#264c30", # 104 - 107
375             "#00260a", "#132618", "#00ff80", "#80ffbf", # 108 - 111
376             "#00a653", "#53a67c", "#008040", "#408060", # 112 - 115
377             "#004c26", "#264c39", "#002613", "#13261d", # 116 - 119
378             "#00ffbf", "#80ffdf", "#00a67c", "#53a691", # 120 - 123
379             "#008060", "#408070", "#004c39", "#264c43", # 124 - 127
380             "#00261d", "#132621", "#00ffff", "#80ffff", # 128 - 131
381             "#00a6a6", "#53a6a6", "#008080", "#408080", # 132 - 135
382             "#004c4c", "#264c4c", "#002626", "#132626", # 136 - 139
383             "#00bfff", "#80dfff", "#007ca6", "#5391a6", # 140 - 143
384             "#006080", "#407080", "#00394c", "#26434c", # 144 - 147
385             "#001d26", "#132126", "#0080ff", "#80bfff", # 148 - 151
386             "#0053a6", "#537ca6", "#004080", "#406080", # 152 - 155
387             "#00264c", "#26394c", "#001326", "#131d26", # 156 - 159
388             "#0040ff", "#809fff", "#0029a6", "#5368a6", # 160 - 163
389             "#002080", "#405080", "#00134c", "#26304c", # 164 - 167
390             "#000a26", "#131826", "#0000ff", "#8080ff", # 168 - 171
391             "#0000a6", "#5353a6", "#000080", "#404080", # 172 - 175
392             "#00004c", "#26264c", "#000026", "#131326", # 176 - 179
393             "#4000ff", "#9f80ff", "#2900a6", "#6853a6", # 180 - 183
394             "#200080", "#504080", "#13004c", "#30264c", # 184 - 187
395             "#0a0026", "#181326", "#8000ff", "#bf80ff", # 188 - 191
396             "#5300a6", "#7c53a6", "#400080", "#604080", # 192 - 195
397             "#26004c", "#39264c", "#130026", "#1d1326", # 196 - 199
398             "#bf00ff", "#df80ff", "#7c00a6", "#9153a6", # 200 - 203
399             "#600080", "#704080", "#39004c", "#43264c", # 204 - 207
400             "#1d0026", "#211326", "#ff00ff", "#ff80ff", # 208 - 211
401             "#a600a6", "#a653a6", "#800080", "#804080", # 212 - 215
402             "#4c004c", "#4c264c", "#260026", "#261326", # 216 - 219
403             "#ff00bf", "#ff80df", "#a6007c", "#a65391", # 220 - 223
404             "#800060", "#804070", "#4c0039", "#4c2643", # 224 - 227
405             "#26001d", "#261321", "#ff0080", "#ff80bf", # 228 - 231
406             "#a60053", "#a6537c", "#800040", "#804060", # 232 - 235
407             "#4c0026", "#4c2639", "#260013", "#26131d", # 236 - 239
408             "#ff0040", "#ff809f", "#a60029", "#a65368", # 240 - 243
409             "#800020", "#804050", "#4c0013", "#4c2630", # 244 - 247
410             "#26000a", "#261318", "#545454", "#767676", # 248 - 251
411             "#989898", "#bbbbbb", "#dddddd", "#000000", # 252 - 255
412             "#000000" # FIXME: By-Layer and By-Block colors have been set as white
413             );
414             ########################################################################
415              
416             =head2 @aci2rgb
417              
418             Generated from @aci2hex for use in postscript and other items. The idea
419             here is that it is a fairly small set of values and may as well have
420             been generated and placed in this file, rather than constantly
421             loading-down the tight loop of saving values to postscript.
422              
423             =cut
424             @aci2rgb = (
425             [255, 255, 255], [255, 0, 0], [255, 255, 0], [ 0, 255, 0],
426             [ 0, 255, 255], [ 0, 0, 255], [255, 0, 255], [255, 255, 255],
427             [178, 178, 178], [192, 192, 192], [255, 0, 0], [255, 128, 128],
428             [166, 0, 0], [166, 83, 83], [128, 0, 0], [128, 64, 64],
429             [ 76, 0, 0], [ 76, 38, 38], [ 38, 0, 0], [ 38, 19, 19],
430             [255, 64, 0], [255, 159, 128], [166, 41, 0], [166, 104, 83],
431             [128, 32, 0], [128, 80, 64], [ 76, 19, 0], [ 76, 48, 38],
432             [ 38, 10, 0], [ 38, 24, 19], [255, 128, 0], [255, 191, 128],
433             [166, 83, 0], [166, 124, 83], [128, 64, 0], [128, 96, 64],
434             [ 76, 38, 0], [ 76, 57, 38], [ 38, 19, 0], [ 38, 29, 19],
435             [255, 191, 0], [255, 223, 128], [166, 124, 0], [166, 145, 83],
436             [128, 96, 0], [128, 112, 64], [ 76, 57, 0], [ 76, 67, 38],
437             [ 38, 29, 0], [ 38, 33, 19], [255, 255, 0], [255, 255, 128],
438             [166, 166, 0], [166, 166, 83], [128, 128, 0], [128, 128, 64],
439             [ 76, 76, 0], [ 76, 76, 38], [ 38, 38, 0], [ 38, 38, 19],
440             [191, 255, 0], [223, 255, 128], [124, 166, 0], [145, 166, 83],
441             [ 96, 128, 0], [112, 128, 64], [ 57, 76, 0], [ 67, 76, 38],
442             [ 29, 38, 0], [ 33, 38, 19], [128, 255, 0], [191, 255, 128],
443             [ 83, 166, 0], [124, 166, 83], [ 64, 128, 0], [ 96, 128, 64],
444             [ 38, 76, 0], [ 57, 76, 38], [ 19, 38, 0], [ 29, 38, 19],
445             [ 64, 255, 0], [159, 255, 128], [ 41, 166, 0], [104, 166, 83],
446             [ 32, 128, 0], [ 80, 128, 64], [ 19, 76, 0], [ 48, 76, 38],
447             [ 10, 38, 0], [ 24, 38, 19], [ 0, 255, 0], [128, 255, 128],
448             [ 0, 166, 0], [ 83, 166, 83], [ 0, 128, 0], [ 64, 128, 64],
449             [ 0, 76, 0], [ 38, 76, 38], [ 0, 38, 0], [ 19, 38, 19],
450             [ 0, 255, 64], [128, 255, 159], [ 0, 166, 41], [ 83, 166, 104],
451             [ 0, 128, 32], [ 64, 128, 80], [ 0, 76, 19], [ 38, 76, 48],
452             [ 0, 38, 10], [ 19, 38, 24], [ 0, 255, 128], [128, 255, 191],
453             [ 0, 166, 83], [ 83, 166, 124], [ 0, 128, 64], [ 64, 128, 96],
454             [ 0, 76, 38], [ 38, 76, 57], [ 0, 38, 19], [ 19, 38, 29],
455             [ 0, 255, 191], [128, 255, 223], [ 0, 166, 124], [ 83, 166, 145],
456             [ 0, 128, 96], [ 64, 128, 112], [ 0, 76, 57], [ 38, 76, 67],
457             [ 0, 38, 29], [ 19, 38, 33], [ 0, 255, 255], [128, 255, 255],
458             [ 0, 166, 166], [ 83, 166, 166], [ 0, 128, 128], [ 64, 128, 128],
459             [ 0, 76, 76], [ 38, 76, 76], [ 0, 38, 38], [ 19, 38, 38],
460             [ 0, 191, 255], [128, 223, 255], [ 0, 124, 166], [ 83, 145, 166],
461             [ 0, 96, 128], [ 64, 112, 128], [ 0, 57, 76], [ 38, 67, 76],
462             [ 0, 29, 38], [ 19, 33, 38], [ 0, 128, 255], [128, 191, 255],
463             [ 0, 83, 166], [ 83, 124, 166], [ 0, 64, 128], [ 64, 96, 128],
464             [ 0, 38, 76], [ 38, 57, 76], [ 0, 19, 38], [ 19, 29, 38],
465             [ 0, 64, 255], [128, 159, 255], [ 0, 41, 166], [ 83, 104, 166],
466             [ 0, 32, 128], [ 64, 80, 128], [ 0, 19, 76], [ 38, 48, 76],
467             [ 0, 10, 38], [ 19, 24, 38], [ 0, 0, 255], [128, 128, 255],
468             [ 0, 0, 166], [ 83, 83, 166], [ 0, 0, 128], [ 64, 64, 128],
469             [ 0, 0, 76], [ 38, 38, 76], [ 0, 0, 38], [ 19, 19, 38],
470             [ 64, 0, 255], [159, 128, 255], [ 41, 0, 166], [104, 83, 166],
471             [ 32, 0, 128], [ 80, 64, 128], [ 19, 0, 76], [ 48, 38, 76],
472             [ 10, 0, 38], [ 24, 19, 38], [128, 0, 255], [191, 128, 255],
473             [ 83, 0, 166], [124, 83, 166], [ 64, 0, 128], [ 96, 64, 128],
474             [ 38, 0, 76], [ 57, 38, 76], [ 19, 0, 38], [ 29, 19, 38],
475             [191, 0, 255], [223, 128, 255], [124, 0, 166], [145, 83, 166],
476             [ 96, 0, 128], [112, 64, 128], [ 57, 0, 76], [ 67, 38, 76],
477             [ 29, 0, 38], [ 33, 19, 38], [255, 0, 255], [255, 128, 255],
478             [166, 0, 166], [166, 83, 166], [128, 0, 128], [128, 64, 128],
479             [ 76, 0, 76], [ 76, 38, 76], [ 38, 0, 38], [ 38, 19, 38],
480             [255, 0, 191], [255, 128, 223], [166, 0, 124], [166, 83, 145],
481             [128, 0, 96], [128, 64, 112], [ 76, 0, 57], [ 76, 38, 67],
482             [ 38, 0, 29], [ 38, 19, 33], [255, 0, 128], [255, 128, 191],
483             [166, 0, 83], [166, 83, 124], [128, 0, 64], [128, 64, 96],
484             [ 76, 0, 38], [ 76, 38, 57], [ 38, 0, 19], [ 38, 19, 29],
485             [255, 0, 64], [255, 128, 159], [166, 0, 41], [166, 83, 104],
486             [128, 0, 32], [128, 64, 80], [ 76, 0, 19], [ 76, 38, 48],
487             [ 38, 0, 10], [ 38, 19, 24], [ 84, 84, 84], [118, 118, 118],
488             [152, 152, 152], [187, 187, 187], [221, 221, 221], [ 0, 0, 0],
489             [255, 255, 255],
490             );
491             ########################################################################
492              
493             =head2 regen_aci2rgb
494              
495             Fairly self-explanatory. Saved here only so I don't lose it.
496              
497             =cut
498             # FIXME: really should put this elsewhere (a BEGIN block!)
499             sub regen_aci2rgb {
500 0     0 1   my $count = 0;
501 0           my $per = 4;
502 0           my $ts = 1;
503 0           print "\@aci2rgb = (\n";
504 0           for(my $i = 0; $i < @aci2hex; $i++) {
505 0           my $hex = $aci2hex[$i];
506 0           $hex =~ s/#(..)(..)(..)//;
507 0           my ($red, $green, $blue) = ($1, $2, $3);
508 0 0         ($count % $per) || print "\t"x$ts;
509 0           $count++;
510 0           print "[" ,
511 0           join(", ", map( { sprintf("%3d", hex($_)) }
512             $red, $green, $blue)), "]";
513 0 0         if($count % $per) {
514 0           print ", ";
515             }
516             else {
517 0           print ",\n";
518             }
519             }
520 0           print "\n", "\t"x$ts, ");\n";
521             } # end subroutine regen_aci2rgb definition
522             ########################################################################
523              
524              
525              
526              
527              
528             ########################################################################
529              
530             1;