From 15214cc0693205788508836fe60cb1d5ab07d00b Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sun, 2 Jan 2011 01:21:39 +0100 Subject: [PATCH] WIP start stubbing and defining time quantisation and timecode entities --- .gitignore | 1 + doc/devel/uml/fig142725.png | Bin 14152 -> 18325 bytes src/lib/Makefile.am | 1 + src/lib/time/formats.hpp | 124 ++++++++++++++++++ src/lib/time/lumitime.cpp | 2 +- src/lib/time/quantiser.hpp | 20 +++ src/lib/time/timecode.cpp | 44 +++++++ src/lib/time/timecode.hpp | 25 +++- src/lib/time/timequant.hpp | 58 +++++++++ src/proc/asset/meta/time-grid.cpp | 17 +++ src/proc/asset/meta/time-grid.hpp | 19 ++- tests/lib/time/time-quantisation-test.cpp | 14 +- uml/lumiera/128517 | 149 ++++++++++++++++++++-- uml/lumiera/142725.diagram | 135 ++++++++++++++------ uml/lumiera/lumiera.prj | 2 +- 15 files changed, 546 insertions(+), 65 deletions(-) create mode 100644 src/lib/time/formats.hpp create mode 100644 src/lib/time/timecode.cpp create mode 100644 src/lib/time/timequant.hpp diff --git a/.gitignore b/.gitignore index 8ba9734d1..c5b3efe27 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ autom4te.cache semantic.cache tests/,* wiki/backups/* +doc/devel/uml/fig128309.png m4/* diff --git a/doc/devel/uml/fig142725.png b/doc/devel/uml/fig142725.png index e69ceab0e28613de3f80e6fd2e6fcd910b196690..08a0e46ef17a0ab88e58084bb711fac4ea176a8d 100644 GIT binary patch literal 18325 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≪ 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 diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index a00b4bdc2..8374eab38 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -62,6 +62,7 @@ liblumiera_la_SOURCES = \ $(liblumiera_la_srcdir)/time.c \ $(liblumiera_la_srcdir)/time/lumitime.cpp \ $(liblumiera_la_srcdir)/time/quantiser.cpp \ + $(liblumiera_la_srcdir)/time/timecode.cpp \ $(liblumiera_la_srcdir)/tmpbuf.c \ $(liblumiera_la_srcdir)/util.cpp diff --git a/src/lib/time/formats.hpp b/src/lib/time/formats.hpp new file mode 100644 index 000000000..5136dcf64 --- /dev/null +++ b/src/lib/time/formats.hpp @@ -0,0 +1,124 @@ +/* + FORMATS.hpp - formats for displaying and specifying time + + Copyright (C) Lumiera.org + 2010, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +#ifndef LIB_TIME_FORMATS_H +#define LIB_TIME_FORMATS_H + +#include "lib/time/timevalue.hpp" + +//#include +#include + + +namespace lib { +namespace time { + + + /** + * descriptor for a time representation format (ABC). + * A time format describes how to specify time; it allows + * to format a time value and to parse a textual representation. + * @note while Format is an generic descriptor, the actual + * TCode (timecode) values are time values, which \em + * use a specific format, given as template parameter + * + * @todo WIP-WIP-WIP + */ + class Format + { + + public: + virtual ~Format(); + }; + + namespace format { + + /** + * Frame count as timecode format. + * An integral number used to count frames + * can be used as a simple from of time code. + * Indeed the Lumiera backend mostly relies on + * these frame counts. As with any timecode, the + * underlying framerate/quantisation remains implicit. + */ + class Frames + : public Format + { + + }; + + + /** + * Widely used standard media timecode format. + * A SMPTE timestamp addresses individual frames, + * by specifying time as hour-minute-second plus the + * frame number within the actual second. + */ + class Smpte + : public Format + { + + }; + + + /** + * The informal hours-minutes-seconds-millisecond timecode. + * As such, this timecode is quantisation agnostic, but usually + * it is used to address some frame or block or otherwise quantised + * entity in time. HMS-Timecode is similar to SMPTE, but uses a + * floating point milliseconds value instead of the frame count + */ + class Hms + : public Format + { + + }; + + + /** + * Simple timecode specification as fractional seconds. + * Similar to HMS, a specification of seconds is quantisation agnostic, + * but usually some implicit quantisation is used anyway, be it on actual + * data frames, audio frames, or just on some smaller time interval, e.g. + * full milliseconds. + * @note Seconds is implemented as rational number and thus uses + * decimal format, not the usual sexagesimal time format + */ + class Seconds + : public Format + { + TimeFract secs_; + }; + + + + /* ==== predefined constants for specifying the format to use ==== */ + + static const Seconds SECONDS; + static const Frames FRAMES; + static const Smpte SMPTE; + static const Hms HMS; + + +}}} // lib::time::format +#endif diff --git a/src/lib/time/lumitime.cpp b/src/lib/time/lumitime.cpp index 072165aa5..0aeacf9fb 100644 --- a/src/lib/time/lumitime.cpp +++ b/src/lib/time/lumitime.cpp @@ -56,7 +56,7 @@ namespace time { /** convenience constructor to build an * internal Lumiera Time value from the usual parts - * of an hexagesimal time specification. Arbitrary integral + * of an sexagesimal time specification. Arbitrary integral * values are acceptable and will be summed up accordingly. * The minute and hour part can be omitted. * @warning internal Lumiera time values refer to an diff --git a/src/lib/time/quantiser.hpp b/src/lib/time/quantiser.hpp index 9db7d88c2..29ab6d9b8 100644 --- a/src/lib/time/quantiser.hpp +++ b/src/lib/time/quantiser.hpp @@ -25,6 +25,7 @@ #define LIB_TIME_QUANTISER_H #include "lib/time/timevalue.hpp" +#include "lib/time/formats.hpp" //#include #include @@ -47,5 +48,24 @@ namespace time { + /** + * Simple stand-alone Quantiser implementation for debugging and test. + * This is a self-contained quantiser implementation without any implicit + * referral to the Lumiera session. It is mainly intended for simplified unit testing. + * @warning real GUI and Proc-Layer code should always prefer to build a real quantiser, + * which referres some TimeGrid definition within the session. Basically, the overall + * purpose of the time-quantisation framework is to enforce such a link to a specific + * time and quantisation scale and to prevent "wild and uncoordinated" rounding attempts. + */ + class FixedFrameQuantiser + : public Quantiser + { + + public: + FixedFrameQuantiser (TimeFract frames_per_second); + }; + + + }} // lib::time #endif diff --git a/src/lib/time/timecode.cpp b/src/lib/time/timecode.cpp new file mode 100644 index 000000000..b739f411f --- /dev/null +++ b/src/lib/time/timecode.cpp @@ -0,0 +1,44 @@ +/* + Timecode - implementation of fixed grid aligned time specifications + + Copyright (C) Lumiera.org + 2010, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +* *****************************************************/ + + +#include "lib/lumitime.hpp" +#include "lib/time/timecode.hpp" +#include "lib/time/timequant.hpp" +#include "lib/time/formats.hpp" + +using std::string; + + +namespace lib { +namespace time { + + + Format::~Format() { } // emit VTable here.... + + + /** */ + + + +}} // lib::time + diff --git a/src/lib/time/timecode.hpp b/src/lib/time/timecode.hpp index d4aebf8c1..54866dd7f 100644 --- a/src/lib/time/timecode.hpp +++ b/src/lib/time/timecode.hpp @@ -25,6 +25,7 @@ #define LIB_TIME_TIMECODE_H #include "lib/time/timevalue.hpp" +#include "lib/time/formats.hpp" //#include #include @@ -36,9 +37,11 @@ namespace time { /** * fixed format time specification. - * + * @param FMT the actual timecode format to use + * @see time::Format * @todo WIP-WIP-WIP */ + template class TCode { @@ -46,6 +49,26 @@ namespace time { }; + class QuTime; + + /** + * A frame counting timecode value. + * This is an hard-coded representation of + * TCode, with additional convenience + * constructors and conversions, which basically make + * FrameNr values interchangeable with integral numbers. + */ + class FrameNr + : public TCode + { + + public: + FrameNr (QuTime const& quantisedTime); + + operator long() const; + }; + + }} // lib::time #endif diff --git a/src/lib/time/timequant.hpp b/src/lib/time/timequant.hpp new file mode 100644 index 000000000..dff03e8ac --- /dev/null +++ b/src/lib/time/timequant.hpp @@ -0,0 +1,58 @@ +/* + TIMEQUANT.hpp - quantised (grid aligned) time values + + Copyright (C) Lumiera.org + 2010, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +#ifndef LIB_TIME_TIMEQUQNT_H +#define LIB_TIME_TIMEQUQNT_H + +#include "lib/time/timevalue.hpp" +#include "lib/time/quantiser.hpp" +#include "lib/time/timecode.hpp" +#include "lib/symbol.hpp" + +//#include +#include + + +namespace lib { +namespace time { + + using lib::Symbol; + + + /** + * fixed format time specification. + * + * @todo WIP-WIP-WIP + */ + class QuTime + { + + public: + QuTime (TimeValue raw, Symbol gridID); + QuTime (TimeValue raw, Quantiser const& quantisation_to_use); + }; + + + +}} // lib::time +#endif diff --git a/src/proc/asset/meta/time-grid.cpp b/src/proc/asset/meta/time-grid.cpp index f7e1e6d5e..15745ec0c 100644 --- a/src/proc/asset/meta/time-grid.cpp +++ b/src/proc/asset/meta/time-grid.cpp @@ -113,4 +113,21 @@ namespace meta { return AssetManager::instance().wrap (newGrid); } + + /* === TimeGrid shortcut builder functions === */ + + PGrid + TimeGrid::build (Symbol gridID, TimeFract frames_per_second) + { + return build (gridID,frames_per_second, Time(0)); + } + + + PGrid + TimeGrid::build (Symbol gridID, TimeFract frames_per_second, Time origin) + { + UNIMPLEMENTED ("build a trivial time grid"); + } + + }} // namespace asset::meta diff --git a/src/proc/asset/meta/time-grid.hpp b/src/proc/asset/meta/time-grid.hpp index 9c0b9ee3b..cc28e8806 100644 --- a/src/proc/asset/meta/time-grid.hpp +++ b/src/proc/asset/meta/time-grid.hpp @@ -49,12 +49,22 @@ #include "proc/asset/meta.hpp" #include "lib/time/timevalue.hpp" +#include "lib/symbol.hpp" namespace asset { namespace meta { + using lib::Symbol; + using lib::time::Time; + using lib::time::TimeValue; + using lib::time::TimeFract; + + + class TimeGrid; + typedef lumiera::P PGrid; + /** * Interface: a grid and scale for time quantisation. @@ -69,19 +79,16 @@ namespace meta { // TODO define the TimeGrid API here + /* === shortcut builder functions === */ + static PGrid build (Symbol gridID, TimeFract frames_per_second); + static PGrid build (Symbol gridID, TimeFract frames_per_second, Time origin); protected: TimeGrid (EntryID const&); }; - - typedef lumiera::P PGrid; - - using lib::time::Time; - using lib::time::TimeValue; - using lib::time::TimeFract; template<> diff --git a/tests/lib/time/time-quantisation-test.cpp b/tests/lib/time/time-quantisation-test.cpp index a770d2f78..1513ab8fa 100644 --- a/tests/lib/time/time-quantisation-test.cpp +++ b/tests/lib/time/time-quantisation-test.cpp @@ -23,7 +23,8 @@ #include "lib/test/run.hpp" #include "lib/test/test-helper.hpp" -#include "lib/time/quantiser.hpp" +#include "lib/time/timequant.hpp" +#include "proc/asset/meta/time-grid.hpp" #include "lib/util.hpp" #include @@ -33,6 +34,7 @@ using boost::lexical_cast; using util::isnil; +using util::contains; //using std::rand; using std::cout; using std::endl; @@ -44,6 +46,8 @@ namespace lib { namespace time{ namespace test{ + using asset::meta::TimeGrid; + /******************************************************** * @test verify handling of quantised time values. @@ -61,14 +65,14 @@ namespace test{ TimeValue ref (refval); CHECK (Time(0) < ref); - checkUsage (ref); + checkSimpleUsage (ref); check_theFullStory (ref); checkMultipleGrids (ref); } void - checkUsage (TimeValue org) + checkSimpleUsage (TimeValue org) { TimeGrid::build("my_simple_grid", 25); // "someone" has defined a time grid @@ -88,8 +92,8 @@ namespace test{ FixedFrameQuantiser fixQ(25); QuTime qVal (org, fixQ); - CHECK (contains (qVal.supportedFormats, format::FRAMES)); - CHECK (contains (qVal.supportedFormats, format::SMPTE)); + CHECK (contains (qVal.supportedFormats(), format::FRAMES)); + CHECK (contains (qVal.supportedFormats(), format::SMPTE)); TCode smpteTCode = qVal.formatAs(); showTimeCode (smpteTCode); diff --git a/uml/lumiera/128517 b/uml/lumiera/128517 index eef0810c5..dcd28563e 100644 --- a/uml/lumiera/128517 +++ b/uml/lumiera/128517 @@ -1,6 +1,6 @@ format 58 "CommonLib" // CommonLib - revision 22 + revision 23 modified_by 5 "hiv" // class settings //class diagram settings @@ -870,21 +870,21 @@ ${inlines} idl_decl "" explicit_switch_type "" - classrelation 206341 // - relation 195461 ---|> + classrelation 210693 // + relation 199813 ---|> a public cpp default "${type}" - classrelation_ref 206341 // - b parent class_ref 168837 // Duration + classrelation_ref 210693 // + b parent class_ref 134917 // Time end - classrelation 206469 // start () - relation 195589 ---> - a role_name "start" protected + classrelation 210821 // dur_ () + relation 199941 ---> + a role_name "dur_" multiplicity "1" protected cpp default " ${comment}${static}${mutable}${volatile}${const}${type}* ${name}${value}; " - classrelation_ref 206469 // start () - b parent class_ref 134917 // Time + classrelation_ref 210821 // dur_ () + b parent class_ref 168837 // Duration end end @@ -916,12 +916,12 @@ ${inlines} idl_decl "" explicit_switch_type "" - classrelation 206213 // - relation 195333 ---|> + classrelation 210437 // + relation 199557 ---|> a public cpp default "${type}" - classrelation_ref 206213 // - b parent class_ref 168709 // TimeValue + classrelation_ref 210437 // + b parent class_ref 172165 // Offset end end @@ -1034,6 +1034,14 @@ ${inlines} python_decl "" idl_decl "" end + + classrelation 210949 // + relation 200069 ---|> + a public + cpp default "${type}" + classrelation_ref 210949 // + b parent class_ref 137093 // Meta + end end class 170373 "TimeVar" @@ -1183,6 +1191,119 @@ ${inlines} b parent class_ref 169221 // TimeGrid end end + + class 172165 "Offset" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + php_decl "" + python_2_2 python_decl "" + idl_decl "" + explicit_switch_type "" + + classrelation 210565 // + relation 199685 ---|> + a public + cpp default "${type}" + classrelation_ref 210565 // + b parent class_ref 168709 // TimeValue + end + end + + class 172293 "Frames" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + php_decl "" + python_2_2 python_decl "" + idl_decl "" + explicit_switch_type "" + + classrelation 211077 // + relation 200197 ---|> + a public + cpp default "${type}" + classrelation_ref 211077 // + b parent class_ref 170757 // Format + end + end + + class 172421 "Smpte" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + php_decl "" + python_2_2 python_decl "" + idl_decl "" + explicit_switch_type "" + + classrelation 211205 // + relation 200325 ---|> + a public + cpp default "${type}" + classrelation_ref 211205 // + b parent class_ref 170757 // Format + end + end + + class 172549 "Hms" + visibility package + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + php_decl "" + python_2_2 python_decl "" + idl_decl "" + explicit_switch_type "" + + classrelation 211333 // + relation 200453 ---|> + a public + cpp default "${type}" + classrelation_ref 211333 // + b parent class_ref 170757 // Format + end + end + + class 172677 "SmpteTC" + visibility package + nactuals 1 + actual class class_ref 170629 // TCode + rank 0 explicit_value "" + cpp_decl "${comment}${template}class ${name}${inherit} + { +${members} }; +${inlines} +" + java_decl "" + php_decl "" + python_2_2 python_decl "" + idl_decl "" + explicit_switch_type "" + + classrelation 211461 // + relation 200581 ---|> + a public + cpp default "${type}" + classrelation_ref 211461 // + b parent class_ref 170629 // TCode + end + end end package_ref 131077 // ConfigQuery diff --git a/uml/lumiera/142725.diagram b/uml/lumiera/142725.diagram index c38a9266c..70a003dcd 100644 --- a/uml/lumiera/142725.diagram +++ b/uml/lumiera/142725.diagram @@ -6,7 +6,7 @@ classcanvas 128005 class_ref 134917 // Time end classcanvas 128133 class_ref 168581 // TimeSpan draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 38 218 2000 + xyz 110 267 2000 end classcanvas 128261 class_ref 168709 // TimeValue draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default @@ -14,19 +14,19 @@ classcanvas 128261 class_ref 168709 // TimeValue end classcanvas 128389 class_ref 168837 // Duration draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 42 118 2000 + xyz 42 182 2000 end classcanvas 129669 class_ref 168965 // QuTime draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 245 324 2000 + xyz 245 361 2000 end classcanvas 130181 class_ref 169093 // Quantiser draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 393 324 2000 + xyz 393 361 2000 end classcanvas 130565 class_ref 169221 // TimeGrid draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 508 324 2000 + xyz 508 361 2000 end classcanvas 130949 class_ref 170373 // TimeVar draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default @@ -34,23 +34,49 @@ classcanvas 130949 class_ref 170373 // TimeVar end classcanvas 131589 class_ref 170501 // QuTimeSpan draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 103 324 2000 + xyz 103 361 2000 end classcanvas 131973 class_ref 170629 // TCode draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 248 413 2000 + xyz 248 450 2000 end classcanvas 132101 class_ref 170757 // Format draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 393 397 2000 + xyz 393 434 2000 end classcanvas 132997 class_ref 170885 // FrameNr draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 238 496 2000 + xyz 243 545 2000 end classcanvas 133253 class_ref 171013 // CompoundGrid draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default - xyz 480 439 2000 + xyz 480 476 2000 +end +classcanvas 133509 class_ref 172165 // Offset + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default + xyz 46 118 2000 +end +classcanvas 135045 class_ref 137093 // Meta + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default + xyz 514 237 2000 +end +note 135429 "Asset System" + xyzwh 504 197 2000 66 47 +classcanvas 135557 class_ref 172293 // Frames + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default + xyz 392 507 1995 +end +classcanvas 135685 class_ref 172421 // Smpte + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default + xyz 446 533 2010 +end +classcanvas 136069 class_ref 172549 // Hms + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default + xyz 421 523 2005 +end +classcanvas 136325 class_ref 172677 // SmpteTC + draw_all_relations default hide_attributes default hide_operations default show_members_full_definition default show_members_visibility default show_members_stereotype default show_members_multiplicity default show_members_initialization default member_max_width 0 show_parameter_dir default show_parameter_name default package_name_in_tab default class_drawing_mode default drawing_language default show_context_mode default auto_label_position default show_infonote default shadow default show_stereotype_properties default + xyz 308 546 2000 end relationcanvas 128517 relation_ref 195205 // geometry VHV unfixed @@ -60,31 +86,16 @@ relationcanvas 128517 relation_ref 195205 // no_role_a no_role_b no_multiplicity_a no_multiplicity_b end -relationcanvas 128901 relation_ref 195333 // - from ref 128389 z 1999 to ref 128261 - no_role_a no_role_b - no_multiplicity_a no_multiplicity_b -end -relationcanvas 129285 relation_ref 195461 // - from ref 128133 z 1999 to ref 128389 - no_role_a no_role_b - no_multiplicity_a no_multiplicity_b -end -relationcanvas 129413 relation_ref 195589 // - from ref 128133 z 1999 to ref 128005 - role_a_pos 111 214 3000 no_role_b - no_multiplicity_a no_multiplicity_b -end relationcanvas 130437 relation_ref 195973 // - from ref 129669 z 1999 stereotype "<>" xyz 309 330 3000 to ref 130181 + from ref 129669 z 1999 stereotype "<>" xyz 309 367 3000 to ref 130181 no_role_a no_role_b - multiplicity_a_pos 376 349 3000 multiplicity_b_pos 305 349 3000 + multiplicity_a_pos 376 386 3000 multiplicity_b_pos 305 386 3000 end relationcanvas 130693 relation_ref 196101 // decenter_end 353 - from ref 130181 z 1999 stereotype "<>" xyz 457 333 3000 to ref 130565 + from ref 130181 z 1999 stereotype "<>" xyz 457 370 3000 to ref 130565 no_role_a no_role_b - multiplicity_a_pos 491 352 3000 no_multiplicity_b + multiplicity_a_pos 491 389 3000 no_multiplicity_b end relationcanvas 130821 relation_ref 197253 // from ref 129669 z 1999 to ref 128005 @@ -101,34 +112,32 @@ relationcanvas 131077 relation_ref 197381 // end relationcanvas 131461 relation_ref 197509 // from ref 130949 z 1999 to ref 128005 - role_a_pos 175 124 3000 no_role_b - multiplicity_a_pos 230 140 3000 multiplicity_b_pos 176 143 3000 + role_a_pos 225 120 3000 no_role_b + multiplicity_a_pos 232 143 3000 multiplicity_b_pos 176 143 3000 end relationcanvas 131717 relation_ref 197637 // - from ref 131589 z 1999 to point 65 290 - line 131845 z 1999 to ref 128133 + from ref 131589 z 1999 to ref 128133 no_role_a no_role_b no_multiplicity_a no_multiplicity_b end relationcanvas 132485 relation_ref 197893 // - from ref 131973 z 1999 to point 290 413 + from ref 131973 z 1999 to point 290 450 line 132869 z 1999 to ref 132101 no_role_a no_role_b no_multiplicity_a no_multiplicity_b end relationcanvas 132613 relation_ref 198021 // - from ref 129669 z 1999 stereotype "<>" xyz 275 378 3000 to ref 131973 + from ref 129669 z 1999 stereotype "<>" xyz 275 415 3000 to ref 131973 no_role_a no_role_b no_multiplicity_a no_multiplicity_b end relationcanvas 132741 relation_ref 198149 // decenter_end 595 - from ref 130181 z 1999 stereotype "<>" xyz 360 377 3000 to ref 132101 + from ref 130181 z 1999 stereotype "<>" xyz 360 414 3000 to ref 132101 no_role_a no_role_b no_multiplicity_a no_multiplicity_b end relationcanvas 133125 relation_ref 198277 // - decenter_begin 581 from ref 132997 z 1999 to ref 131973 no_role_a no_role_b no_multiplicity_a no_multiplicity_b @@ -139,4 +148,56 @@ relationcanvas 133381 relation_ref 198405 // no_role_a no_role_b no_multiplicity_a no_multiplicity_b end +relationcanvas 133637 relation_ref 199557 // + from ref 128389 z 1999 to ref 133509 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end +relationcanvas 133765 relation_ref 199685 // + from ref 133509 z 1999 to ref 128261 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end +relationcanvas 134277 relation_ref 199813 // + from ref 128133 z 1999 to point 137 248 + line 134533 z 1999 to point 268 194 + line 134405 z 1999 to ref 128005 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end +relationcanvas 134661 relation_ref 199941 // + geometry VHr + from ref 128133 z 1999 to point 66 284 + line 134789 z 1999 to ref 128389 + role_a_pos 75 269 3000 no_role_b + multiplicity_a_pos 52 226 3000 no_multiplicity_b +end +relationcanvas 135301 relation_ref 200069 // + from ref 130565 z 1999 to ref 135045 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end +relationcanvas 135813 relation_ref 200197 // + from ref 135557 z 1994 to ref 132101 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end +relationcanvas 135941 relation_ref 200325 // + from ref 135685 z 1999 to ref 132101 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end +relationcanvas 136197 relation_ref 200453 // + from ref 136069 z 1999 to ref 132101 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end +relationcanvas 136453 relation_ref 200581 // + geometry VHV + from ref 136325 z 1999 to point 334 522 + line 136581 z 1999 to point 268 522 + line 136709 z 1999 to ref 131973 + no_role_a no_role_b + no_multiplicity_a no_multiplicity_b +end end diff --git a/uml/lumiera/lumiera.prj b/uml/lumiera/lumiera.prj index d6e97d779..1380666d0 100644 --- a/uml/lumiera/lumiera.prj +++ b/uml/lumiera/lumiera.prj @@ -1,6 +1,6 @@ format 58 "lumiera" - revision 66 + revision 67 modified_by 5 "hiv" cpp_root_dir "../../src/"