Ver Fonte

SVI Переделка кода

SVI há 1 semana atrás
pai
commit
a6771b0011

+ 1 - 1
go.mod

@@ -5,6 +5,7 @@ go 1.26.2
 require (
 require (
 	github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b
 	github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b
 	github.com/gofiber/fiber/v2 v2.52.13
 	github.com/gofiber/fiber/v2 v2.52.13
+	github.com/google/uuid v1.6.0
 	gitp78su.ipnodns.ru/svi/kern/v3 v3.1.1
 	gitp78su.ipnodns.ru/svi/kern/v3 v3.1.1
 	gopkg.in/yaml.v3 v3.0.1
 	gopkg.in/yaml.v3 v3.0.1
 )
 )
@@ -19,7 +20,6 @@ require (
 	github.com/go-logr/logr v1.4.3 // indirect
 	github.com/go-logr/logr v1.4.3 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/google/flatbuffers v25.12.19+incompatible // indirect
 	github.com/google/flatbuffers v25.12.19+incompatible // indirect
-	github.com/google/uuid v1.6.0 // indirect
 	github.com/klauspost/compress v1.18.6 // indirect
 	github.com/klauspost/compress v1.18.6 // indirect
 	github.com/mattn/go-colorable v0.1.14 // indirect
 	github.com/mattn/go-colorable v0.1.14 // indirect
 	github.com/mattn/go-isatty v0.0.22 // indirect
 	github.com/mattn/go-isatty v0.0.22 // indirect

+ 1 - 1
lev0/types/iactor.go

@@ -3,5 +3,5 @@ package types
 // IActor -- интерфейс актора
 // IActor -- интерфейс актора
 type IActor interface {
 type IActor interface {
 	IElemBase
 	IElemBase
-	IUseGroupLink
+	IElemUseGroupLink
 }
 }

+ 4 - 2
lev0/types/icoord.go

@@ -8,6 +8,8 @@ type ICoord interface {
 	X() alias.CoordX
 	X() alias.CoordX
 	// Y -- возвращает координату Y
 	// Y -- возвращает координату Y
 	Y() alias.CoordY
 	Y() alias.CoordY
-	// Coord -- возвращает координаты
-	Coord() (alias.CoordX, alias.CoordY)
+	// Get -- возвращает координаты
+	Get() (alias.CoordX, alias.CoordY)
+	// Int -- возвращает целые координаты
+	Int() (int, int)
 }
 }

+ 4 - 5
lev0/types/ielem_base.go

@@ -6,13 +6,12 @@ import (
 
 
 // IElemBase -- интерфейс элемента схемы
 // IElemBase -- интерфейс элемента схемы
 type IElemBase interface {
 type IElemBase interface {
-	ILabel
 	// Type -- возвращает тип элемента
 	// Type -- возвращает тип элемента
 	Type() alias.Type
 	Type() alias.Type
 	// Id -- возвращает идентификатор
 	// Id -- возвращает идентификатор
 	Id() alias.Id
 	Id() alias.Id
-	// Elem -- возвращает элементы словаря
-	Elem() map[string]interface{}
-	// Checker -- проверяет правильность схемы
-	Check(map[alias.Id]IElemDrawer) string
+	// SelfCheck -- самопроверка базового элемента
+	SelfCheck()
+	// Coord -- возвращает координаты метки
+	Coord() ICoord
 }
 }

+ 1 - 1
lev0/types/ielem_drawer.go

@@ -8,7 +8,7 @@ import (
 
 
 // IElemDrawer -- интерфейс элемента схемы для рисования
 // IElemDrawer -- интерфейс элемента схемы для рисования
 type IElemDrawer interface {
 type IElemDrawer interface {
-	IUseGroupLink
+	IElemUseGroupLink
 	// Draw -- рисует с контролем источника и получателя
 	// Draw -- рисует с контролем источника и получателя
 	Draw(canvas *svg.SVG, elem map[alias.Id]IElemDrawer)
 	Draw(canvas *svg.SVG, elem map[alias.Id]IElemDrawer)
 }
 }

+ 5 - 4
lev0/types/ilabel.go → lev0/types/ielem_label.go

@@ -4,12 +4,13 @@ import (
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 )
 )
 
 
-// ILabel -- надпись с координатами XY
-type ILabel interface {
+// IElemLabel -- надпись
+type IElemLabel interface {
+	IElemBase
 	// Get -- возвращает метку
 	// Get -- возвращает метку
 	Get() alias.Label
 	Get() alias.Label
-	// Coord -- возвращает координаты метки
-	Coord() ICoord
+	// String -- возвращает строку
+	String() string
 	// Offset -- возвращает смещение метки
 	// Offset -- возвращает смещение метки
 	Offset() IOffset
 	Offset() IOffset
 }
 }

+ 2 - 2
lev0/types/ilinker.go → lev0/types/ielem_linker.go

@@ -2,8 +2,8 @@ package types
 
 
 import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 
 
-// ILinker -- интерфейс связи между объектами
-type ILinker interface {
+// IElemLinker -- интерфейс связи между объектами
+type IElemLinker interface {
 	IElemBase
 	IElemBase
 	// Src -- возвращает источник связи
 	// Src -- возвращает источник связи
 	SrcId() alias.Id
 	SrcId() alias.Id

+ 2 - 2
lev0/types/iuse_case.go → lev0/types/ielem_use_case.go

@@ -2,8 +2,8 @@ package types
 
 
 import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 
 
-// IUseCase -- интерфейс к вариантам использования
-type IUseCase interface {
+// IElemUseCase -- интерфейс к вариантам использования
+type IElemUseCase interface {
 	IElemBase
 	IElemBase
 	// Links -- ссылки вариантов использования
 	// Links -- ссылки вариантов использования
 	Links() []alias.Id
 	Links() []alias.Id

+ 2 - 2
lev0/types/iuse_group_link.go → lev0/types/ielem_use_group_link.go

@@ -2,8 +2,8 @@ package types
 
 
 import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 
 
-// IUseGroupLink -- интерфейс группы ссылок
-type IUseGroupLink interface {
+// IElemUseGroupLink -- интерфейс группы ссылок
+type IElemUseGroupLink interface {
 	IElemBase
 	IElemBase
 	// Links -- ссылки актора
 	// Links -- ссылки актора
 	Links() []alias.Id
 	Links() []alias.Id

+ 4 - 2
lev0/types/ioffset.go

@@ -8,6 +8,8 @@ type IOffset interface {
 	X() alias.CoordX
 	X() alias.CoordX
 	// Y -- возвращает смещение Y
 	// Y -- возвращает смещение Y
 	Y() alias.CoordY
 	Y() alias.CoordY
-	// Offset -- возвращает смещение
-	Offset() (alias.CoordX, alias.CoordY)
+	// Int -- возвращает смещение
+	Int() (int, int)
+	// Val -- возвращает смещение
+	Val() (alias.CoordX, alias.CoordY)
 }
 }

+ 17 - 0
lev0/types/iyaml_marsh.go

@@ -0,0 +1,17 @@
+package types
+
+import (
+	"gopkg.in/yaml.v3"
+)
+
+// YamlMarshal -- интерфейс для маршалера в YAML
+type YamlMarshal interface {
+	// MarshalYAML -- метод должен возвращать то, что реально запишется в YAML
+	MarshalYAML() (any, error)
+}
+
+// YamlUnmarshal -- интерфейс для маршалера в YAML
+type YamlUnmarshal interface {
+	// UnmarshalYAML -- метод должен возвращать то, что загрузится из YAML
+	UnmarshalYAML(value *yaml.Node) error
+}

+ 12 - 1
lev1/coord/coord.go

@@ -3,6 +3,7 @@ package coord
 
 
 import (
 import (
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
+	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
 )
 )
 
 
 // Coord -- координаты точки
 // Coord -- координаты точки
@@ -12,7 +13,7 @@ type Coord struct {
 }
 }
 
 
 // NewCoord -- возвращает новую координаты
 // NewCoord -- возвращает новую координаты
-func NewCoord(x alias.CoordX, y alias.CoordY) *Coord {
+func NewCoord(x alias.CoordX, y alias.CoordY) types.ICoord {
 	sf := &Coord{
 	sf := &Coord{
 		X_: x,
 		X_: x,
 		Y_: y,
 		Y_: y,
@@ -34,3 +35,13 @@ func (sf *Coord) Y() alias.CoordY {
 func (sf *Coord) Coord() (alias.CoordX, alias.CoordY) {
 func (sf *Coord) Coord() (alias.CoordX, alias.CoordY) {
 	return sf.X_, sf.Y_
 	return sf.X_, sf.Y_
 }
 }
+
+// Int -- возвращает целые координаты
+func (sf *Coord) Int() (int, int) {
+	return int(sf.X_), int(sf.Y_)
+}
+
+// Get -- возвращает целые координаты
+func (sf *Coord) Get() (alias.CoordX, alias.CoordY) {
+	return sf.X_, sf.Y_
+}

+ 59 - 0
lev1/elem_label/elem_label.go

@@ -0,0 +1,59 @@
+// package elem_label -- текстовая метка для отображения
+package elem_label
+
+import (
+	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
+	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
+	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/elem_base"
+	"gitp78su.ipnodns.ru/svi/kern/v3"
+)
+
+// ElemLabel -- текстовая метка для отображения
+type ElemLabel struct {
+	types.IElemBase
+	Val_    alias.Label   `yaml:"val"`    // Метка для вывода
+	Offset_ types.IOffset `yaml:"offset"` // Смещение метки
+}
+
+var (
+	hassert = kern.GetFnHassert()
+)
+
+// NewElemLabel -- возвращает новую метку
+func NewElemLabel(label alias.Label, coord  types.ICoord, offset types.IOffset) types.IElemLabel {
+	sf := &ElemLabel{
+		IElemBase: elem_base.NewElemBase(coord, "elem_label"),
+		Val_:      label,
+		Offset_:   offset,
+	}
+	sf.SelfCheck()
+	return sf
+}
+
+// SelfCheck -- самопроверка типа
+func (sf *ElemLabel) SelfCheck() {
+	sf.IElemBase.SelfCheck()
+	hassert(sf.Offset_ != nil, "SelfCheck(): Offset_ is nil")
+}
+
+// String -- возвращает метку
+//
+//go:fix inline
+func (sf *ElemLabel) String() string {
+	return string(sf.Val_)
+}
+
+
+// Get -- возвращает метку
+//
+//go:fix inline
+func (sf *ElemLabel) Get() alias.Label {
+	return sf.Val_
+}
+
+// Offset -- возвращает смещение метки
+//
+//go:fix inline
+func (sf *ElemLabel) Offset() types.IOffset {
+	return sf.Offset_
+}

+ 0 - 48
lev1/label/label.go

@@ -1,48 +0,0 @@
-// package label -- текстовая метка для отображения
-package label
-
-import (
-	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
-	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/coord"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/offset"
-	"gitp78su.ipnodns.ru/svi/kern/v3"
-)
-
-// Label -- текстовая метка для отображения
-type Label struct {
-	Val_    alias.Label    `yaml:"val"`     // Метка для вывода
-	Offset_ *offset.Offset `yaml:"offsetX"` // Смещение метки
-	Coord_  *coord.Coord   `yaml:"coord"`   // Координаты метки
-}
-
-var (
-	hassert = kern.GetFnHassert()
-)
-
-// NewLabel -- возвращает новую метку
-func NewLabel(label alias.Label, coord *coord.Coord, offset *offset.Offset) *Label {
-	hassert(label != "", "NewLabel(): label is empty")
-	hassert(coord != nil, "NewLabel(): coord is nil")
-	hassert(offset != nil, "NewLabel(): offset is nil")
-	return &Label{
-		Val_:    label,
-		Offset_: offset,
-		Coord_:  coord,
-	}
-}
-
-// Get -- возвращает метку
-func (sf *Label) Get() alias.Label {
-	return sf.Val_
-}
-
-// Coord -- возвращает координаты метки
-func (sf *Label) Coord() types.ICoord {
-	return sf.Coord_
-}
-
-// Offset -- возвращает смещение метки
-func (sf *Label) Offset() types.IOffset {
-	return sf.Offset_
-}

+ 24 - 25
lev2/mod_http/serv_http.go

@@ -15,6 +15,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
+	"gitp78su.ipnodns.ru/svi/goarch/lev1/coord"
+	"gitp78su.ipnodns.ru/svi/goarch/lev1/size"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/canvas"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/canvas"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/views/view_actor"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/views/view_actor"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/views/view_link"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/views/view_link"
@@ -30,12 +32,12 @@ var indexHtml []byte
 
 
 // CanvasSize -- размер хоста
 // CanvasSize -- размер хоста
 type CanvasSize struct {
 type CanvasSize struct {
-	Width  int `form:"w"`
-	Height int `form:"h"`
+	SizeX_ int `form:"w"`
+	SizeY_ int `form:"h"`
 }
 }
 
 
 func (sf *CanvasSize) String() string {
 func (sf *CanvasSize) String() string {
-	return fmt.Sprintf("w:%v; h:%v", sf.Width, sf.Height)
+	return fmt.Sprintf("w:%v; h:%v", sf.SizeX_, sf.SizeY_)
 }
 }
 
 
 // ModHttp -- http-модуль для архитектуры
 // ModHttp -- http-модуль для архитектуры
@@ -43,9 +45,11 @@ type ModHttp struct {
 	// fibApp     *fiber.App
 	// fibApp     *fiber.App
 	kCtx       ktypes.IKernelCtx
 	kCtx       ktypes.IKernelCtx
 	log        ktypes.ILogBuf
 	log        ktypes.ILogBuf
-	diaMode    string     // Режим диаграммы
-	oldBinArch []byte     // Кеш старой архитектуры
-	canvSize   CanvasSize // Размер холста
+	diaMode    string       // Режим диаграммы
+	oldBinArch []byte       // Кеш старой архитектуры
+	canvSize   CanvasSize   // Размер холста
+	size       *size.Size   // Размер холста в его координатах
+	pos        *coord.Coord // Координаты холста
 }
 }
 
 
 // NewModHttp -- возвращает новый сервис
 // NewModHttp -- возвращает новый сервис
@@ -57,6 +61,8 @@ func NewModHttp() *ModHttp {
 		kCtx:    kern.GetKernelCtx(),
 		kCtx:    kern.GetKernelCtx(),
 		log:     log,
 		log:     log,
 		diaMode: cons.ModeUseCase,
 		diaMode: cons.ModeUseCase,
+		size:    size.NewSize(800, 600),
+		pos:     coord.NewCoord(0, 0),
 	}
 	}
 	sHttp := kern.GetKernelServerHttp()
 	sHttp := kern.GetKernelServerHttp()
 	fibApp := sHttp.Fiber()
 	fibApp := sHttp.Fiber()
@@ -83,6 +89,12 @@ func (sf *ModHttp) postSetCanvasSize(ctx *fiber.Ctx) error {
 	if err != nil {
 	if err != nil {
 		sf.log.Err("postSetCanvasSize(): on body parser, err=\n\t%v", err)
 		sf.log.Err("postSetCanvasSize(): on body parser, err=\n\t%v", err)
 	}
 	}
+	if sf.canvSize.SizeX_ > 0 {
+		sf.size.W_ = alias.SizeX(sf.canvSize.SizeX_ - 10)
+	}
+	if sf.canvSize.SizeY_ > 0 {
+		sf.size.H_ = alias.SizeY(sf.canvSize.SizeY_ - 10)
+	}
 	return ctx.SendString(sf.canvSize.String())
 	return ctx.SendString(sf.canvSize.String())
 }
 }
 
 
@@ -110,7 +122,7 @@ func (sf *ModHttp) canvas(wr *bytes.Buffer, lstElem []map[string]interface{}) (*
 	if !isFind {
 	if !isFind {
 		return nil, fmt.Errorf("ServHttp.canvas(): in mapElem, config not found")
 		return nil, fmt.Errorf("ServHttp.canvas(): in mapElem, config not found")
 	}
 	}
-	confCanvas := canvas.NewCanvas(sf.diaMode, elem)
+	confCanvas := canvas.NewCanvas(sf.diaMode, sf.size, sf.pos)
 	sizeX, sizeY := confCanvas.Size()
 	sizeX, sizeY := confCanvas.Size()
 	canvas := svg.New(wr)
 	canvas := svg.New(wr)
 	canvas.Start(int(sizeX), int(sizeY))
 	canvas.Start(int(sizeX), int(sizeY))
@@ -183,29 +195,16 @@ func (sf *ModHttp) useCase(canvas *svg.SVG, lstElem []map[string]interface{}) er
 		}
 		}
 		var (
 		var (
 			drawer types.IElemDrawer
 			drawer types.IElemDrawer
-			err    error
 		)
 		)
 		switch strType {
 		switch strType {
 		case cons.TypeUseActor: // Нарисовать актора
 		case cons.TypeUseActor: // Нарисовать актора
-			drawer, err = view_actor.NewViewActor(elem)
-			if err != nil {
-				return fmt.Errorf("ServHttp.useCase(): id=%q, in create Actor, err=<br>%v", id, err)
-			}
+			view_actor.NewViewActor(actor, elem)
 		case cons.TypeUseCase: // Нарисовать вариант использования
 		case cons.TypeUseCase: // Нарисовать вариант использования
-			drawer, err = view_use_case.NewViewUseCase(elem)
-			if err != nil {
-				return fmt.Errorf("ServHttp.useCase(): id=%q, err=%w<br>%+v", id, err, string(binElem))
-			}
+			drawer = view_use_case.NewViewUseCase(useCase, elem)
 		case cons.TypeUseLink: // Нарисовать связь
 		case cons.TypeUseLink: // Нарисовать связь
-			drawer, err = view_link.NewViewLink(elem)
-			if err != nil {
-				return fmt.Errorf("ServHttp.useCase(): id=%q, in create Link, err=%w<br>%+v", id, err, string(binElem))
-			}
+			drawer = view_link.NewViewLink(useLink)
 		case cons.TypeUseGroup: // Нарисовать группу вариантов использования
 		case cons.TypeUseGroup: // Нарисовать группу вариантов использования
-			drawer, err = view_use_group.NewViewUseGroup(elem)
-			if err != nil {
-				return fmt.Errorf("ServHttp.useCase(): id=%q, in create UseGroup, err=%w<br>%+v", id, err, string(binElem))
-			}
+			drawer = view_use_group.NewViewUseGroup(useGroup, elem)
 		}
 		}
 		if drawer != nil {
 		if drawer != nil {
 			mapDraw[id] = drawer
 			mapDraw[id] = drawer
@@ -214,7 +213,7 @@ func (sf *ModHttp) useCase(canvas *svg.SVG, lstElem []map[string]interface{}) er
 	}
 	}
 	for _, drawer := range mapDraw {
 	for _, drawer := range mapDraw {
 		switch drawer.(type) {
 		switch drawer.(type) {
-		case types.ILinker:
+		case types.IElemLinker:
 		}
 		}
 		drawer.Draw(canvas, mapDraw)
 		drawer.Draw(canvas, mapDraw)
 	}
 	}

+ 4 - 4
pkg/elems/actor/actor.go

@@ -2,14 +2,14 @@
 package actor
 package actor
 
 
 import (
 import (
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/label"
+	"gitp78su.ipnodns.ru/svi/goarch/lev1/elem_label"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/use_group_link"
 	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/use_group_link"
 	"gitp78su.ipnodns.ru/svi/kern/v3"
 	"gitp78su.ipnodns.ru/svi/kern/v3"
 )
 )
 
 
 // Actor -- сущность актора
 // Actor -- сущность актора
 type Actor struct {
 type Actor struct {
-	Label_        *label.Label                 `yaml:"label"`
+	Label_        *elem_label.ElemLabel        `yaml:"label"`
 	UseGroupLink_ *use_group_link.UseGroupLink `yaml:"use_group_link"`
 	UseGroupLink_ *use_group_link.UseGroupLink `yaml:"use_group_link"`
 }
 }
 
 
@@ -18,12 +18,12 @@ var (
 )
 )
 
 
 // NewActor -- возвращает новый актор
 // NewActor -- возвращает новый актор
-func NewActor(label *label.Label, useGroupLink *use_group_link.UseGroupLink) (*Actor, error) {
+func NewActor(label *elem_label.ElemLabel, useGroupLink *use_group_link.UseGroupLink) (*Actor, error) {
 	hassert(label != nil, "NewActor(): label==nil")
 	hassert(label != nil, "NewActor(): label==nil")
 	hassert(useGroupLink != nil, "NewActor(): useGroupLink==nil")
 	hassert(useGroupLink != nil, "NewActor(): useGroupLink==nil")
 	sf := &Actor{
 	sf := &Actor{
 		UseGroupLink_: useGroupLink,
 		UseGroupLink_: useGroupLink,
-		Label_:       label,
+		Label_:        label,
 	}
 	}
 	return sf, nil
 	return sf, nil
 }
 }

+ 4 - 4
pkg/elems/canvas/canvas.go

@@ -17,15 +17,15 @@ type Canvas struct {
 	diaMode string
 	diaMode string
 }
 }
 
 
-var(
+var (
 	hassert = kern.GetFnHassert()
 	hassert = kern.GetFnHassert()
 )
 )
 
 
 // NewCanvas -- возвращает новый холст
 // NewCanvas -- возвращает новый холст
 func NewCanvas(diaMode string, size *size.Size, pos *coord.Coord) *Canvas {
 func NewCanvas(diaMode string, size *size.Size, pos *coord.Coord) *Canvas {
-	hassert(diaMode!="","NewCanvas(): diaMode is empty")
-	hassert(size!=nil,"NewCanvas(): size is nil")
-	hassert(pos!=nil,"NewCanvas(): pos is nil")
+	hassert(diaMode != "", "NewCanvas(): diaMode is empty")
+	hassert(size != nil, "NewCanvas(): size is nil")
+	hassert(pos != nil, "NewCanvas(): pos is nil")
 	sf := &Canvas{
 	sf := &Canvas{
 		size:    size,
 		size:    size,
 		pos:     pos,
 		pos:     pos,

+ 27 - 21
pkg/elems/elem_base/elem_base.go

@@ -2,20 +2,18 @@
 package elem_base
 package elem_base
 
 
 import (
 import (
+	"github.com/google/uuid"
+
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/coord"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/label"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/offset"
+	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
 	"gitp78su.ipnodns.ru/svi/kern/v3"
 	"gitp78su.ipnodns.ru/svi/kern/v3"
 )
 )
 
 
 // ElemBase -- базовый объект
 // ElemBase -- базовый объект
 type ElemBase struct {
 type ElemBase struct {
-	Label_   *label.Label           `yaml:"label"`    // название объекта
-	Id_      alias.Id               `yaml:"id"`       // Идентификатор объекта
-	Type_    alias.Type             `yaml:"type"`     // Тип объекта
-	Elem_    map[string]interface{} `yaml:"map_elem"` // Набор полей
-	StrElem_ string                 // Строковое представление объекта
+	Id_    alias.Id     `yaml:"id"`    // Идентификатор объекта
+	Type_  alias.Type   `yaml:"type"`  // Тип объекта
+	Coord_ types.ICoord `yaml:"coord"` // Координаты элемента
 }
 }
 
 
 var (
 var (
@@ -23,32 +21,40 @@ var (
 )
 )
 
 
 // NewElemBase -- возвращает новый базовый объект
 // NewElemBase -- возвращает новый базовый объект
-func NewElemBase(id alias.Id, label_ alias.Label, labelCoord *coord.Coord,
-	labelOffset *offset.Offset, type_ alias.Type,
-	elem map[string]interface{}, binElem []byte) *ElemBase {
-	hassert(id != "", "NewElemBase(): id is empty")
-	hassert(type_ != "", "NewElemBase(): type is empty")
+func NewElemBase(coord types.ICoord, type_ alias.Type) types.IElemBase {
 	sf := &ElemBase{
 	sf := &ElemBase{
-		Elem_:    elem,
-		StrElem_: string(binElem),
-		Label_:   label.NewLabel(label_, labelCoord, labelOffset),
-		Id_:      id,
-		Type_:    type_,
+		Coord_: coord,
+		Id_:    alias.Id(uuid.New().String()),
+		Type_:  type_,
 	}
 	}
+	sf.SelfCheck()
 	return sf
 	return sf
 }
 }
 
 
-// Elem -- возвращает элементы словаря
-func (sf *ElemBase) Elem() map[string]interface{} {
-	return sf.Elem_
+// Coord -- возвращает координаты элемента
+//
+//go:fix inline
+func (sf *ElemBase) Coord() types.ICoord {
+	return sf.Coord_
 }
 }
 
 
 // Type -- возвращает тип объекта
 // Type -- возвращает тип объекта
+//
+//go:fix inline
 func (sf *ElemBase) Type() alias.Type {
 func (sf *ElemBase) Type() alias.Type {
 	return sf.Type_
 	return sf.Type_
 }
 }
 
 
 // Id -- возвращает ID объекта
 // Id -- возвращает ID объекта
+//
+//go:fix inline
 func (sf *ElemBase) Id() alias.Id {
 func (sf *ElemBase) Id() alias.Id {
 	return sf.Id_
 	return sf.Id_
 }
 }
+
+// SelfCheck -- самопроверка базового элемента
+func (sf *ElemBase) SelfCheck() {
+	hassert(sf.Id_ != "", "ElemBase.SelfCheck(): Id_ is empty")
+	hassert(sf.Type_ != "", "NewElemBase(): Type_ is empty")
+	hassert(sf.Coord_ != nil, "NewElemBase(): Coord_ == nil")
+}

+ 1 - 1
pkg/elems/use_case/use_case.go

@@ -65,7 +65,7 @@ func (sf *UseCase) Check(mapElem map[alias.Id]types.IElemDrawer) string {
 			msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
 			msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
 			continue
 			continue
 		}
 		}
-		ln, isOk := link.(types.ILinker)
+		ln, isOk := link.(types.IElemLinker)
 		if !isOk {
 		if !isOk {
 			msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
 			msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
 			continue
 			continue

+ 1 - 1
pkg/elems/use_group/use_group.go

@@ -25,7 +25,7 @@ func NewUseGroup(elemBase *elem_base.ElemBase, size *size.Size) *UseGroup {
 	hassert(size != nil, "NewUseGroup(): size is nil")
 	hassert(size != nil, "NewUseGroup(): size is nil")
 	sf := &UseGroup{
 	sf := &UseGroup{
 		ElemBase_: elemBase,
 		ElemBase_: elemBase,
-		Size_:    size,
+		Size_:     size,
 	}
 	}
 	return sf
 	return sf
 }
 }

+ 2 - 2
pkg/elems/use_group_link/use_group_link.go

@@ -43,7 +43,7 @@ func NewUseGroupLink(elemBase *elem_base.ElemBase, id alias.Id, label_ alias.Lab
 	}
 	}
 	sf := &UseGroupLink{
 	sf := &UseGroupLink{
 		ElemBase_: elemBase,
 		ElemBase_: elemBase,
-		Links_:   links,
+		Links_:    links,
 	}
 	}
 	return sf, nil
 	return sf, nil
 }
 }
@@ -61,7 +61,7 @@ func (sf *UseGroupLink) Check(mapElem map[alias.Id]types.IElemDrawer) string {
 			msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не существует\n", id)
 			msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не существует\n", id)
 			continue
 			continue
 		}
 		}
-		ln, isOk := link.(types.ILinker)
+		ln, isOk := link.(types.IElemLinker)
 		if !isOk {
 		if !isOk {
 			msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не ILinker\n", id)
 			msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не ILinker\n", id)
 			continue
 			continue

+ 4 - 4
pkg/elems/use_link/use_link.go

@@ -105,7 +105,7 @@ func (sf *UseLink) checkDst(mapDrawer map[alias.Id]types.IElemDrawer) string {
 			return fmt.Sprintf("Невзаимная ссылка\nid=%q,dst=(%q)", sf.ElemBase_.Id_, actor.Id())
 			return fmt.Sprintf("Невзаимная ссылка\nid=%q,dst=(%q)", sf.ElemBase_.Id_, actor.Id())
 		}
 		}
 	case cons.TypeUseLink:
 	case cons.TypeUseLink:
-		link, isOk := dst.(types.ILinker)
+		link, isOk := dst.(types.IElemLinker)
 		if !isOk {
 		if !isOk {
 			return fmt.Sprintf("Недопустимый тип получателя(%q)\nтип=%q\n", dst.Id(), dst.Type())
 			return fmt.Sprintf("Недопустимый тип получателя(%q)\nтип=%q\n", dst.Id(), dst.Type())
 		}
 		}
@@ -114,7 +114,7 @@ func (sf *UseLink) checkDst(mapDrawer map[alias.Id]types.IElemDrawer) string {
 			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, link.Id())
 			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, link.Id())
 		}
 		}
 	case cons.TypeUseCase:
 	case cons.TypeUseCase:
-		useCase, isOk := dst.(types.IUseCase)
+		useCase, isOk := dst.(types.IElemUseCase)
 		if !isOk {
 		if !isOk {
 			return fmt.Sprintf("id=%q, Недопустимый тип получателя(%q)\nтип=%q\n", sf.ElemBase_.Id_, dst.Id(), dst.Type())
 			return fmt.Sprintf("id=%q, Недопустимый тип получателя(%q)\nтип=%q\n", sf.ElemBase_.Id_, dst.Id(), dst.Type())
 		}
 		}
@@ -157,7 +157,7 @@ func (sf *UseLink) checkSrc(mapDrawer map[alias.Id]types.IElemDrawer) string {
 			return fmt.Sprintf("Невзаимная ссылка с актором %q\n", actor.Id())
 			return fmt.Sprintf("Невзаимная ссылка с актором %q\n", actor.Id())
 		}
 		}
 	case cons.TypeUseLink:
 	case cons.TypeUseLink:
-		link, isOk := src.(types.ILinker)
+		link, isOk := src.(types.IElemLinker)
 		if !isOk {
 		if !isOk {
 			return fmt.Sprintf("Несоответствие типа источника(%q)\nтип='useLink'\n", src.Id())
 			return fmt.Sprintf("Несоответствие типа источника(%q)\nтип='useLink'\n", src.Id())
 		}
 		}
@@ -166,7 +166,7 @@ func (sf *UseLink) checkSrc(mapDrawer map[alias.Id]types.IElemDrawer) string {
 			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, link.Id())
 			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, link.Id())
 		}
 		}
 	case cons.TypeUseCase:
 	case cons.TypeUseCase:
-		useCase, isOk := src.(types.IUseCase)
+		useCase, isOk := src.(types.IElemUseCase)
 		if !isOk {
 		if !isOk {
 			return fmt.Sprintf("id=%q, Тип источника(%q) не совпадает с фактическим\nтип='useCase'\n", sf.ElemBase_.Id_, src.Id())
 			return fmt.Sprintf("id=%q, Тип источника(%q) не совпадает с фактическим\nтип='useCase'\n", sf.ElemBase_.Id_, src.Id())
 		}
 		}

+ 2 - 2
pkg/views/view_actor/view_actor.go

@@ -17,8 +17,8 @@ type ViewActor struct {
 	Actor_ *actor.Actor
 	Actor_ *actor.Actor
 }
 }
 
 
-var(
-	hassert=kern.GetFnHassert()
+var (
+	hassert = kern.GetFnHassert()
 )
 )
 
 
 // NewViewActor -- возвращает новый SVG-актор
 // NewViewActor -- возвращает новый SVG-актор

+ 5 - 5
pkg/views/view_link/view_link.go

@@ -15,13 +15,13 @@ type Link struct {
 	UseLink_ *use_link.UseLink
 	UseLink_ *use_link.UseLink
 }
 }
 
 
-var(
-	hassert=kern.GetFnHassert()
+var (
+	hassert = kern.GetFnHassert()
 )
 )
 
 
 // NewViewLink -- возвращает новое отображение связи
 // NewViewLink -- возвращает новое отображение связи
 func NewViewLink(useLink *use_link.UseLink) *Link {
 func NewViewLink(useLink *use_link.UseLink) *Link {
-	hassert(useLink!=nil, "NewViewLink: useLink is nil")
+	hassert(useLink != nil, "NewViewLink: useLink is nil")
 	sf := &Link{
 	sf := &Link{
 		UseLink_: useLink,
 		UseLink_: useLink,
 	}
 	}
@@ -41,11 +41,11 @@ func (sf *Link) Draw(canvas *svg.SVG, mapDrawer map[alias.Id]types.IElemDrawer)
 	offY := int(_y)
 	offY := int(_y)
 	// Линия
 	// Линия
 	canvas.Line(x, y, x1, y1, "stroke:black;stroke-width:1")
 	canvas.Line(x, y, x1, y1, "stroke:black;stroke-width:1")
-	strLabel:=string(sf.UseLink_.ElemBase_.Label_.Val_)
+	strLabel := string(sf.UseLink_.ElemBase_.Label_.Val_)
 	if strLabel != "" {
 	if strLabel != "" {
 		canvas.Text(x+offX, y+offY, strLabel, "font-size: 12px; font-family: Courier; fill: black")
 		canvas.Text(x+offX, y+offY, strLabel, "font-size: 12px; font-family: Courier; fill: black")
 	}
 	}
-	strTypeLink:=string(sf.UseLink_.TypeLink_)
+	strTypeLink := string(sf.UseLink_.TypeLink_)
 	if strTypeLink != "" {
 	if strTypeLink != "" {
 		canvas.Text(x+offX, y+offY+12, "<<"+strTypeLink+">>", "font-size: 12px; font-family: Courier; fill: black")
 		canvas.Text(x+offX, y+offY+12, "<<"+strTypeLink+">>", "font-size: 12px; font-family: Courier; fill: black")
 	}
 	}

+ 2 - 2
pkg/views/view_use_case/view_use_case.go

@@ -21,7 +21,7 @@ var (
 
 
 // NewViewUseCase -- возвращает новый вариант использования
 // NewViewUseCase -- возвращает новый вариант использования
 func NewViewUseCase(useCase *use_case.UseCase, elem map[string]interface{}) *ViewUseCase {
 func NewViewUseCase(useCase *use_case.UseCase, elem map[string]interface{}) *ViewUseCase {
-	hassert(useCase != nil,"NewViewUseCase(): useCase=nil")
+	hassert(useCase != nil, "NewViewUseCase(): useCase=nil")
 	sf := &ViewUseCase{
 	sf := &ViewUseCase{
 		UseCase_: useCase,
 		UseCase_: useCase,
 	}
 	}
@@ -37,7 +37,7 @@ func (sf *ViewUseCase) Draw(canvas *svg.SVG, mapElem map[alias.Id]types.IElemDra
 	h := int(sf.UseCase_.Size_.H_)
 	h := int(sf.UseCase_.Size_.H_)
 	// Овал
 	// Овал
 	canvas.Ellipse(x+70, y, w, h, "fill:none;stroke:black")
 	canvas.Ellipse(x+70, y, w, h, "fill:none;stroke:black")
-	strLabel:=string(sf.UseCase_.ElemBase_.Label_.Val_)
+	strLabel := string(sf.UseCase_.ElemBase_.Label_.Val_)
 	if strLabel != "" {
 	if strLabel != "" {
 		canvas.Text(x+offX, y+6, strLabel, "font-size: 14px; font-family: Courier; fill: black")
 		canvas.Text(x+offX, y+6, strLabel, "font-size: 14px; font-family: Courier; fill: black")
 	}
 	}

+ 5 - 5
pkg/views/view_use_group/view_use_group.go

@@ -15,17 +15,17 @@ type ViewUseGroup struct {
 	UseGroup *use_group.UseGroup
 	UseGroup *use_group.UseGroup
 }
 }
 
 
-var(
-	hassert=kern.GetFnHassert()
+var (
+	hassert = kern.GetFnHassert()
 )
 )
 
 
 // NewViewUseGroup -- возвращает новое отображение группы вариант использования
 // NewViewUseGroup -- возвращает новое отображение группы вариант использования
-func NewViewUseGroup(useGroup *use_group.UseGroup, elem map[string]interface{}) (*ViewUseGroup, error) {
+func NewViewUseGroup(useGroup *use_group.UseGroup, elem map[string]interface{}) *ViewUseGroup {
 	hassert(useGroup != nil, "NewViewUseGroup(): useGroup == nil")
 	hassert(useGroup != nil, "NewViewUseGroup(): useGroup == nil")
 	sf := &ViewUseGroup{
 	sf := &ViewUseGroup{
 		UseGroup: useGroup,
 		UseGroup: useGroup,
 	}
 	}
-	return sf, nil
+	return sf
 }
 }
 
 
 // Draw -- рисует группу вариантов использования
 // Draw -- рисует группу вариантов использования
@@ -39,7 +39,7 @@ func (sf *ViewUseGroup) Draw(canvas *svg.SVG, mapElem map[alias.Id]types.IElemDr
 	canvas.Rect(x, y, w, h, "fill:none;stroke:black")
 	canvas.Rect(x, y, w, h, "fill:none;stroke:black")
 	// Заголовок
 	// Заголовок
 	canvas.Rect(x, y-26, h/2, 26, "fill:none;stroke:black")
 	canvas.Rect(x, y-26, h/2, 26, "fill:none;stroke:black")
-	strLabel:=string(sf.UseGroup.ElemBase_.Label_.Val_)
+	strLabel := string(sf.UseGroup.ElemBase_.Label_.Val_)
 	if strLabel != "" {
 	if strLabel != "" {
 		canvas.Text(x+offX, y-8, strLabel, "font-size: 14px; font-family: Courier; fill: black")
 		canvas.Text(x+offX, y-8, strLabel, "font-size: 14px; font-family: Courier; fill: black")
 	}
 	}