1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
%%
%% wings_shape.erl --
%%
%% Utilities for shape records.
%%
-module(wings_shape).
-export([insert/3]).
-include("wings.hrl").
%%%
%%% Exported functions.
%%%
%% new(We, Suffix, St0) -> St.
%% Suffix = cut | clone | copy | extract | sep
%%
%% Create a new object based on an old object. The name
%% will be created from the old name (with digits and known
%% suffixes stripped) with the given Suffix and a number
%% appended.
insert(#we{name=OldName}=We0, Suffix, #st{shapes=Shapes0,onext=Oid}=St) ->
Name = new_name(OldName, Suffix, Oid),
We = We0#we{id=Oid,name=Name},
Shapes = gb_trees:insert(Oid, We, Shapes0),
St#st{shapes=Shapes,onext=Oid+1}.
%%%
%%% Local functions follow.
%%%
new_name(OldName, Suffix0, Id) ->
Suffix = suffix(Suffix0),
Base = base(lists:reverse(OldName)),
lists:reverse(Base, "_" ++ Suffix ++ integer_to_list(Id)).
%% Note: Filename suffixes are intentionally not translated.
%% If we are to translate them in the future, base/1 below
%% must be updated to strip suffixes (both for the current language
%% and for English).
suffix(cut) -> "cut";
suffix(clone) -> "clone";
suffix(copy) -> "copy";
suffix(extract) -> "extract";
suffix(mirror) -> "mirror";
suffix(sep) -> "sep".
%% base_1(ReversedName) -> ReversedBaseName
%% Given an object name, strip digits and known suffixes to
%% create a base name. Returns the unchanged name if
%% no known suffix could be stripped.
base(OldName) ->
case base_1(OldName) of
error -> OldName;
Base -> Base
end.
base_1([H|T]) when $0 =< H, H =< $9 -> base_1(T);
base_1("tuc_"++Base) -> Base; %"_cut"
base_1("enolc_"++Base) -> Base; %"_clone"
base_1("ypoc_"++Base) -> Base; %"_copy"
base_1("tcartxe_"++Base) -> Base; %"_extract"
base_1("rorrim_"++Base) -> Base; %"_mirror"
base_1("pes_"++Base) -> Base; %"_sep"
base_1(_Base) -> error.
|