Ver código fonte

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

SVI 1 semana atrás
pai
commit
35cb116db0

+ 14 - 0
lev0/types/ielem_link.go

@@ -0,0 +1,14 @@
+package types
+
+// IElemLink -- интерфейс связи между объектами
+type IElemLink interface {
+	IElemBase
+	// Src -- возвращает источник связи
+	Src() IElemBase
+	// Dst -- возвращает получателя связи
+	Dst() IElemBase
+	// Label -- метка связи
+	Label() IElemLabel
+	// CoordEnd -- координаты конца связи
+	CoordEnd() ICoord
+}

+ 0 - 12
lev0/types/ielem_linker.go

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

+ 1 - 1
lev0/types/ielem_use_case.go

@@ -6,7 +6,7 @@ import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 type IElemUseCase interface {
 	IElemBase
 	// Links -- ссылки вариантов использования
-	Links() map[alias.Id]IElemLinker
+	Links() map[alias.Id]IElemLink
 	// Label -- метка варианта использования
 	Label() IElemLabel
 }

+ 5 - 3
lev0/types/isize.go

@@ -3,15 +3,17 @@ package types
 import "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 
 // ISize -- интерфейс для размера
-type ISize interface{
+type ISize interface {
 	// Get -- возвращает размер
 	Get() (alias.SizeX, alias.SizeY)
 	// Int -- возвращает размер
-	Int()(int,int)
+	Int() (int, int)
 	// W -- возвращает размер по Х
 	W() alias.SizeX
 	// H -- возвращает размер по Y
 	H() alias.SizeY
 	// SelfCheck -- проверяет корректность размера
 	SelfCheck()
-}
+	// String -- возвращает строковое представление
+	String() string
+}

+ 8 - 7
pkg/elems/actor/actor.go → lev1/elem_actor/elem_actor.go

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

+ 0 - 0
pkg/elems/elem_base/elem_base.go → lev1/elem_base/elem_base.go


+ 1 - 1
lev1/elem_label/elem_label.go

@@ -7,7 +7,7 @@ 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/goarch/lev1/elem_base"
 )
 
 // ElemLabel -- текстовая метка для отображения

+ 202 - 0
lev1/elem_link/elem_link.go

@@ -0,0 +1,202 @@
+// package elem_link -- связь между объектами
+package elem_link
+
+import (
+	"fmt"
+
+	"gitp78su.ipnodns.ru/svi/kern/v3"
+
+	"gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
+	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
+)
+
+// ElemLink -- связь между объектами
+type ElemLink struct {
+	types.IElemBase
+	CoordEnd_ types.ICoord    `yaml:"coord_end"` // Координаты второй точки
+	Src_      types.IElemBase `yaml:"src"`       // Источник координат
+	Dst_      types.IElemBase `yaml:"dst"`       // Получатель координат
+
+	TypeLink_ string `yaml:"typeLink"` // Тип связи
+}
+
+var (
+	hassert = kern.GetFnHassert()
+)
+
+// NewElemLink -- возвращает новую связь
+func NewElemLink(elemBase types.IElemBase, coordEnd types.ICoord,
+	src, dst types.IElemBase, typeLink string) types.IElemLink {
+
+	sf := &ElemLink{
+		IElemBase: elemBase,
+		CoordEnd_: coordEnd,
+		Src_:      src,
+		Dst_:      dst,
+		TypeLink_: typeLink,
+	}
+	return sf
+}
+
+// SelfCheck -- самопроверка элемента
+func (sf *ElemLink) SelfCheck() {
+	sf.IElemBase.SelfCheck()
+	hassert(sf.CoordEnd_ != nil, "ElemLink.SelfCheck(): id=%v, CoordEnd_ == nil", sf.Id())
+	hassert(sf.Src_ != nil, "ElemLink.SelfCheck(): id=%v, Src_ == nil", sf.Id())
+	hassert(sf.Dst_ != nil, "ElemLink.SelfCheck(): id=%v, Dst_ == nil", sf.Id())
+	hassert(sf.TypeLink_ != "", "ElemLink.SelfCheck(): id=%v, TypeLink_ is empty", sf.Id())
+}
+
+// CoordEnd -- координаты конца связи
+//
+//go:fix inline
+func (sf *ElemLink) CoordEnd() types.ICoord {
+	return sf.CoordEnd_
+}
+
+// Links -- ссылки актора
+func (sf *ElemLink) Links() []types.IElemBase {
+	return []types.IElemBase{sf.Src_, sf.Dst_}
+}
+
+// Check -- проверяет связи между объектами
+func (sf *ElemLink) Check() string {
+	if sf.Dst_.Id() == sf.Src_.Id() {
+		return fmt.Sprintf("ВНИМАНИЕ! Источник и получатель совпадают\nsrc=%v, dst=%v\n",
+			sf.Src_.Id(), sf.Dst_.Id())
+	}
+	if msgErr := sf.checkSrc(); msgErr != "" {
+		return "ОШИБКА при проверке связи источника\n" + msgErr
+	}
+	if msgErr := sf.checkDst(); msgErr != "" {
+		return "ОШИБКА при проверке связи получателя\n" + msgErr
+	}
+	if sf.TypeLink_ == "" { // Проверка на правильность типа связи
+		return "Пустой собственный тип связи\n"
+	}
+	return ""
+}
+
+// проверить связь получателя
+func (sf *ElemLink) checkDst() string {
+	if sf.Dst_ == nil {
+		return "ОШИБКА получатель `dst` не задан"
+	}
+	// Вычислить на допустимые типы для получателя
+	switch sf.Dst_.Type() {
+	case cons.TypeUseActor:
+		actor, isOk := sf.Dst_.(types.IActor)
+		if !isOk {
+			return fmt.Sprintf("Недопустимый тип получателя(%q)\nтип=%q\n", sf.Dst_.Id(), sf.Dst_.Type())
+		}
+		isOk = false
+		for _, id := range actor.Links() {
+			if id == sf.Id() {
+				isOk = true
+				break
+			}
+		}
+		if !isOk {
+			return fmt.Sprintf("Невзаимная ссылка\nid=%q,dst=(%q)",
+				sf.Id(), actor.Id())
+		}
+	case cons.TypeUseLink:
+		link, isOk := sf.Dst_.(types.IElemLink)
+		if !isOk {
+			return fmt.Sprintf("Недопустимый тип получателя(%q)\nтип=%q\n",
+				sf.Dst_.Id(), sf.Dst_.Type())
+		}
+		isOk = sf.Id() == link.Dst().Id() || sf.Id() == link.Src().Id()
+		if !isOk {
+			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.Id(), link.Id())
+		}
+	case cons.TypeUseCase:
+		useCase, isOk := sf.Dst_.(types.IElemUseCase)
+		if !isOk {
+			return fmt.Sprintf("id=%q, Недопустимый тип получателя(%q)\nтип=%q\n",
+				sf.Id(), sf.Dst_.Id(), sf.Dst_.Type())
+		}
+		isOk = false
+		for id := range useCase.Links() {
+			if id == sf.Id() {
+				isOk = true
+				break
+			}
+		}
+		if !isOk {
+			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n",
+				sf.Id(), useCase.Id())
+		}
+	default: // Недопустимый источник
+		return fmt.Sprintf("id=%q, Недопустимый тип получателя(%q)\nid=%q\n",
+			sf.Id(), sf.Dst_.Type(), sf.Dst_.Id())
+	}
+	return ""
+}
+
+// Проверяет связь источника
+func (sf *ElemLink) checkSrc() string {
+	if sf.Src_ == nil {
+		return "ВНИМАНИЕ! Источник связи не задан(src)\n"
+	}
+	switch sf.Src_.Type() {
+	case cons.TypeUseActor:
+		isOk := false
+		actor := sf.Src_.(types.IActor)
+		for _, id := range actor.Links() { // Проверка на взаимность
+			if id == sf.Id() {
+				isOk = true
+				break
+			}
+		}
+		if !isOk {
+			return fmt.Sprintf("Невзаимная ссылка с актором %q\n", actor.Id())
+		}
+	case cons.TypeUseLink:
+		link, isOk := sf.Src_.(types.IElemLink)
+		if !isOk {
+			return fmt.Sprintf("Несоответствие типа источника(%q)\nтип='useLink'\n",
+				sf.Src_.Id())
+		}
+		isOk = sf.Id() == link.Dst().Id() || sf.Id() == link.Src().Id()
+		if !isOk {
+			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n",
+				sf.Id(), link.Id())
+		}
+	case cons.TypeUseCase:
+		useCase, isOk := sf.Src_.(types.IElemUseCase)
+		if !isOk {
+			return fmt.Sprintf("id=%q, Тип источника(%q) не совпадает с фактическим\nтип='useCase'\n",
+				sf.Id(), sf.Src_.Id())
+		}
+		isOk = false
+		for id := range useCase.Links() { // Проверка на взаимность
+			if id == sf.Id() {
+				isOk = true
+				break
+			}
+		}
+		if !isOk {
+			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n",
+				sf.Id(), useCase.Id())
+		}
+	default: // Неизвестный источник
+		return fmt.Sprintf("id=%q, неизвестный тип источника(%q)<br>id=%q\n",
+			sf.Id(), sf.Src_.Type(), sf.Src_.Id())
+	}
+	return ""
+}
+
+// Src -- возвращает источник связи
+//
+//go:fix inline
+func (sf *ElemLink) Src() types.IElemBase {
+	return sf.Src_
+}
+
+// Dst -- возвращает получателя связи
+//
+//go:fix inline
+func (sf *ElemLink) Dst() types.IElemBase {
+	return sf.Dst_
+}

+ 4 - 3
lev1/elem_use_case/elem_use_case.go

@@ -60,14 +60,15 @@ func (sf *UseCase) SelfCheck() {
 			msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
 			continue
 		}
-		ln, isOk := link.(types.IElemLinker)
+		ln, isOk := link.(types.IElemLink)
 		if !isOk {
 			msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
 			continue
 		}
 		// Проверить что ссылка взаимная
-		if !(ln.SrcId() == sf.Id() || ln.DstId() == sf.Id()) {
-			msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n", id, ln.SrcId(), ln.DstId())
+		if !(ln.Src().Id() == sf.Id() || ln.Dst().Id() == sf.Id()) {
+			msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n",
+			id, ln.Src().Id(), ln.Dst().Id())
 		}
 	}
 }

+ 11 - 11
pkg/elems/use_group_link/use_group_link.go → lev1/group_link/group_link.go

@@ -1,5 +1,5 @@
-// package use_group_link -- группа связей в вариантах использования
-package use_group_link
+// package group_link -- группа связей
+package group_link
 
 import (
 	"fmt"
@@ -7,12 +7,12 @@ 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/elem_base"
 	"gitp78su.ipnodns.ru/svi/goarch/lev1/offset"
-	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/elem_base"
 )
 
-// UseGroupLink -- группа связей в вариантах использования
-type UseGroupLink struct {
+// GroupLink -- группа связей
+type GroupLink struct {
 	ElemBase_ *elem_base.ElemBase `yaml:"elem_base"`
 	Links_    []alias.Id          `yaml:"link"` // Связи объекта
 }
@@ -20,7 +20,7 @@ type UseGroupLink struct {
 // NewUseGroupLink -- возвращает новый группу связей в вариантах использования
 func NewUseGroupLink(elemBase *elem_base.ElemBase, id alias.Id, label_ alias.Label,
 	labelCoord *coord.Coord, labelOffset *offset.Offset,
-	type_ alias.Type, elem map[string]interface{}, binElem []byte) (*UseGroupLink, error) {
+	type_ alias.Type, elem map[string]interface{}, binElem []byte) (*GroupLink, error) {
 	_links0, isOk := elem["links"]
 	if !isOk {
 		return nil, fmt.Errorf("NewUseGroupLink(): id=%q, field `links` not found", id)
@@ -41,7 +41,7 @@ func NewUseGroupLink(elemBase *elem_base.ElemBase, id alias.Id, label_ alias.Lab
 		}
 		links = append(links, id1)
 	}
-	sf := &UseGroupLink{
+	sf := &GroupLink{
 		ElemBase_: elemBase,
 		Links_:    links,
 	}
@@ -49,7 +49,7 @@ func NewUseGroupLink(elemBase *elem_base.ElemBase, id alias.Id, label_ alias.Lab
 }
 
 // Check -- проверяет ошибки связей
-func (sf *UseGroupLink) Check(mapElem map[alias.Id]types.IDrawer) string {
+func (sf *GroupLink) Check(mapElem map[alias.Id]types.IDrawer) string {
 	var msgErr string
 	if len(sf.Links_) == 0 {
 		msgErr = "Список ссылок(links) пуст\n"
@@ -61,12 +61,12 @@ func (sf *UseGroupLink) Check(mapElem map[alias.Id]types.IDrawer) string {
 			msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не существует\n", id)
 			continue
 		}
-		ln, isOk := link.(types.IElemLinker)
+		ln, isOk := link.(types.IElemLink)
 		if !isOk {
 			msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не ILinker\n", id)
 			continue
 		}
-		if !(ln.SrcId() == sf.ElemBase_.Id_ || ln.DstId() == sf.ElemBase_.Id_) {
+		if !(ln.Src().Id() == sf.ElemBase_.Id_ || ln.Dst().Id() == sf.ElemBase_.Id_) {
 			msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не взаимная\n", id)
 			continue
 		}
@@ -75,6 +75,6 @@ func (sf *UseGroupLink) Check(mapElem map[alias.Id]types.IDrawer) string {
 }
 
 // Links -- ссылки вариантов использования
-func (sf *UseGroupLink) Links() []alias.Id {
+func (sf *GroupLink) Links() []alias.Id {
 	return sf.Links_
 }

+ 11 - 10
lev1/size/size.go

@@ -2,6 +2,8 @@
 package size
 
 import (
+	"fmt"
+
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
 	"gitp78su.ipnodns.ru/svi/kern/v3"
@@ -13,11 +15,10 @@ type Size struct {
 	H_ alias.SizeY
 }
 
-var(
-	hassert=kern.GetFnHassert()
+var (
+	hassert = kern.GetFnHassert()
 )
 
-
 // NewSize -- возвращает новый размер
 func NewSize(w alias.SizeX, h alias.SizeY) types.ISize {
 	sf := &Size{
@@ -30,14 +31,14 @@ func NewSize(w alias.SizeX, h alias.SizeY) types.ISize {
 
 // SelfCheck -- проверяет корректность размера
 func (sf *Size) SelfCheck() {
-	hassert(sf.H_>=0, "Size.SelfCheck(): H_(%v)<0",sf.H_)
-	hassert(sf.W_>=0, "Size.SelfCheck(): W_(%v)<0",sf.W_)
+	hassert(sf.H_ >= 0, "Size.SelfCheck(): H_(%v)<0", sf.H_)
+	hassert(sf.W_ >= 0, "Size.SelfCheck(): W_(%v)<0", sf.W_)
 }
 
-
-
-
-
+// String -- возвращает строковое представление размера
+func (sf *Size) String() string {
+	return fmt.Sprintf("size:%vx%v", sf.W_, sf.H_)
+}
 
 // W -- возвращает ширину
 func (sf *Size) W() alias.SizeX {
@@ -57,4 +58,4 @@ func (sf *Size) Get() (alias.SizeX, alias.SizeY) {
 // Int -- возвращает размер
 func (sf *Size) Int() (int, int) {
 	return int(sf.W_), int(sf.H_)
-}
+}

+ 12 - 15
pkg/views/view_link/view_link.go → lev1/view_link/view_link.go

@@ -3,16 +3,15 @@ package view_link
 
 import (
 	svg "github.com/ajstarks/svgo"
+	"gitp78su.ipnodns.ru/svi/kern/v3"
 
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
-	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/use_link"
-	"gitp78su.ipnodns.ru/svi/kern/v3"
 )
 
-// Link -- отображение связи между объектами
-type Link struct {
-	UseLink_ *use_link.UseLink
+// ViewLink -- отображение связи между объектами
+type ViewLink struct {
+	types.IElemLink
 }
 
 var (
@@ -20,20 +19,18 @@ var (
 )
 
 // NewViewLink -- возвращает новое отображение связи
-func NewViewLink(useLink *use_link.UseLink) *Link {
+func NewViewLink(useLink types.IElemLink) *ViewLink {
 	hassert(useLink != nil, "NewViewLink: useLink is nil")
-	sf := &Link{
-		UseLink_: useLink,
+	sf := &ViewLink{
+		IElemLink: useLink,
 	}
 	return sf
 }
 
 // Draw -- рисует связь между объектами
-func (sf *Link) Draw(canvas *svg.SVG, mapDrawer map[alias.Id]types.IDrawer) {
-	_x, _y := sf.UseLink_.ElemBase_.Label_.Coord_.Coord()
-	x := int(_x)
-	y := int(_y)
-	_x, _y = sf.UseLink_.CoordEnd_.Coord()
+func (sf *ViewLink) Draw(canvas *svg.SVG, mapDrawer map[alias.Id]types.IDrawer) {
+	x, y := sf.Label().Coord().Int()
+	_x, _y = sf.CoordEnd().Coord()
 	x1 := int(_x)
 	y1 := int(_y)
 	_x, _y = sf.UseLink_.ElemBase_.Label_.Offset_.Offset()
@@ -58,11 +55,11 @@ func (sf *Link) Draw(canvas *svg.SVG, mapDrawer map[alias.Id]types.IDrawer) {
 }
 
 // SrcId -- возвращает источник связи
-func (sf *Link) SrcId() alias.Id {
+func (sf *ViewLink) SrcId() alias.Id {
 	return sf.Src_
 }
 
 // DstId -- возвращает получателя связи
-func (sf *Link) DstId() alias.Id {
+func (sf *ViewLink) DstId() alias.Id {
 	return sf.Dst_
 }

+ 11 - 6
lev2/mod_http/serv_http.go

@@ -89,13 +89,18 @@ func (sf *ModHttp) postSetCanvasSize(ctx *fiber.Ctx) error {
 	if err != nil {
 		sf.log.Err("postSetCanvasSize(): on body parser, err=\n\t%v", err)
 	}
+	var (
+		w alias.SizeX
+		h alias.SizeY
+	)
 	if sf.canvSize.SizeX_ > 0 {
-		sf.size.W_ = alias.SizeX(sf.canvSize.SizeX_ - 10)
+		w = alias.SizeX(sf.canvSize.SizeX_ - 10)
 	}
 	if sf.canvSize.SizeY_ > 0 {
-		sf.size.H_ = alias.SizeY(sf.canvSize.SizeY_ - 10)
+		h = alias.SizeY(sf.canvSize.SizeY_ - 10)
 	}
-	return ctx.SendString(sf.canvSize.String())
+	sf.size = size.NewSize(w, h)
+	return ctx.SendString(sf.size.String())
 }
 
 // Возвращает новый холст
@@ -123,9 +128,9 @@ func (sf *ModHttp) canvas(wr *bytes.Buffer, lstElem []map[string]interface{}) (*
 		return nil, fmt.Errorf("ServHttp.canvas(): in mapElem, config not found")
 	}
 	confCanvas := canvas.NewCanvas(sf.diaMode, sf.size, sf.pos)
-	sizeX, sizeY := confCanvas.Size()
+	sizeX, sizeY := confCanvas.Size().Int()
 	canvas := svg.New(wr)
-	canvas.Start(int(sizeX), int(sizeY))
+	canvas.Start(sizeX, sizeY)
 	confCanvas.Draw(canvas)
 	return canvas, nil
 }
@@ -213,7 +218,7 @@ func (sf *ModHttp) useCase(canvas *svg.SVG, lstElem []map[string]interface{}) er
 	}
 	for _, drawer := range mapDraw {
 		switch drawer.(type) {
-		case types.IElemLinker:
+		case types.IElemLink:
 		}
 		drawer.Draw(canvas, mapDraw)
 	}

+ 11 - 15
pkg/elems/canvas/canvas.go

@@ -3,17 +3,15 @@ package canvas
 
 import (
 	svg "github.com/ajstarks/svgo"
-
-	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/coord"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/size"
 	"gitp78su.ipnodns.ru/svi/kern/v3"
+
+	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
 )
 
 // Canvas -- объект холста
 type Canvas struct {
-	size    *size.Size
-	pos     *coord.Coord
+	size    types.ISize
+	pos     types.ICoord
 	diaMode string
 }
 
@@ -22,7 +20,7 @@ var (
 )
 
 // NewCanvas -- возвращает новый холст
-func NewCanvas(diaMode string, size *size.Size, pos *coord.Coord) *Canvas {
+func NewCanvas(diaMode string, size types.ISize, pos types.ICoord) *Canvas {
 	hassert(diaMode != "", "NewCanvas(): diaMode is empty")
 	hassert(size != nil, "NewCanvas(): size is nil")
 	hassert(pos != nil, "NewCanvas(): pos is nil")
@@ -36,18 +34,16 @@ func NewCanvas(diaMode string, size *size.Size, pos *coord.Coord) *Canvas {
 
 // Draw -- рисует холст
 func (sf *Canvas) Draw(canvas *svg.SVG) {
-	x := int(sf.pos.X_)
-	y := int(sf.pos.Y_)
-	w := int(sf.size.W_)
-	h := int(sf.size.H_)
+	x,y := sf.pos.Int()
+	w,h := sf.size.Int()
 	canvas.Rect(0, 0, w, h, "fill:white;stroke:red;stroke-width:1")
 	canvas.Text(x, y+2, "АРХИТЕКТУРНОЕ РЕШЕНИЕ", "font-size: 20px; font-family: sans-serif; fill: black")
 	canvas.Text(x+15, y+20, sf.diaMode, "font-size: 14px; font-family: sans-serif; fill: black")
 }
 
 // Size -- возвращает размер холста
-func (sf *Canvas) Size() (alias.SizeX, alias.SizeY) {
-	w := sf.size.W_
-	h := sf.size.H_
-	return w, h
+//
+//go:fix inline
+func (sf *Canvas) Size()types.ISize {
+	return sf.size
 }

+ 0 - 197
pkg/elems/use_link/use_link.go

@@ -1,197 +0,0 @@
-// package use_link -- связь между объектами
-package use_link
-
-import (
-	"fmt"
-
-	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
-	"gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
-	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
-	"gitp78su.ipnodns.ru/svi/goarch/lev1/coord"
-	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/elem_base"
-	"gitp78su.ipnodns.ru/svi/kern/v3"
-)
-
-// UseLink -- связь между объектами
-type UseLink struct {
-	ElemBase_ *elem_base.ElemBase `yaml:"elem_base"`
-	CoordEnd_ *coord.Coord        `yaml:"coord1"` // Координаты второй точки
-	Src_      alias.Id            `yaml:"src"`    // Источник координат
-	Dst_      alias.Id            `yaml:"dst"`    // Получатель координат
-
-	TypeLink_ string `yaml:"typeLink"` // Тип связи
-}
-
-var (
-	hassert = kern.GetFnHassert()
-)
-
-// NewUseLink -- возвращает новую связь
-func NewUseLink(elemBase *elem_base.ElemBase, coordEnd *coord.Coord) *UseLink {
-	hassert(elemBase != nil, "NewUseLink(): elemBase is nil")
-	hassert(coordEnd != nil, "NewUseLink(): coordEnd is nil")
-
-	id := elemBase.Id_
-	_src := elemBase.Elem_["src"]
-	src0, isOk := _src.(string)
-	hassert(isOk, "NewUseLink(): id=%q, field `src` not string, type=%T, value=%v", id, _src, elemBase.StrElem_)
-	src := alias.Id(src0)
-	hassert(src != "", "NewUseLink(): id=%q, `src` is empty", id)
-	_dst := elemBase.Elem_["dst"]
-	dst0, isOk := _dst.(string)
-	hassert(isOk, "NewUseLink(): id=%q, field `dst` not string, type=%T, value=%+v<br>%+v", id, _dst, _dst, elemBase.StrElem_)
-	dst := alias.Id(dst0)
-	_typeLink, isOk := elemBase.Elem_["type_link"]
-	hassert(isOk, "NewUseLink(): name=%q, field `type_link` not found<br>%+v", id, elemBase.StrElem_)
-	typeLink, isOk := _typeLink.(string)
-	hassert(isOk, "NewUseLink(): name=%q, `type_link`(%+v) not string", id, _typeLink)
-	hassert(typeLink != "", "NewUseLink(): name=%q, type_link=%q is empty", id, typeLink)
-	sf := &UseLink{
-		ElemBase_: elemBase,
-		CoordEnd_: coordEnd,
-		Src_:      src,
-		Dst_:      dst,
-		TypeLink_: typeLink,
-	}
-	return sf
-}
-
-// Links -- ссылки актора
-func (sf *UseLink) Links() []alias.Id {
-	return []alias.Id{sf.Src_, sf.Dst_}
-}
-
-// Check -- проверяет связи между объектами
-func (sf *UseLink) Check(mapDrawer map[alias.Id]types.IDrawer) string {
-	if sf.Dst_ == sf.Src_ {
-		return fmt.Sprintf("ВНИМАНИЕ! Источник и получатель совпадают\nsrc=%v, dst=%v\n", sf.Src_, sf.Dst_)
-	}
-	if msgErr := sf.checkSrc(mapDrawer); msgErr != "" {
-		return "ОШИБКА при проверке связи источника\n" + msgErr
-	}
-	if msgErr := sf.checkDst(mapDrawer); msgErr != "" {
-		return "ОШИБКА при проверке связи получателя\n" + msgErr
-	}
-	if sf.TypeLink_ == "" { // Проверка на правильность типа связи
-		return "Пустой собственный тип связи\n"
-	}
-	return ""
-}
-
-// проверить связь получателя
-func (sf *UseLink) checkDst(mapDrawer map[alias.Id]types.IDrawer) string {
-	if sf.Dst_ == "" {
-		return "ОШИБКА получатель `dst` не задан"
-	}
-	dst, isOk := mapDrawer[sf.Dst_] // Вычислить, если такой получатель
-	if !isOk {
-		return "Отсутствует собственный получатель(dst)\n"
-	}
-	// Вычислить на допустимые типы для получателя
-	switch dst.Type() {
-	case cons.TypeUseActor:
-		actor, isOk := dst.(types.IActor)
-		if !isOk {
-			return fmt.Sprintf("Недопустимый тип получателя(%q)\nтип=%q\n", dst.Id(), dst.Type())
-		}
-		isOk = false
-		for _, id := range actor.Links() {
-			if id == sf.ElemBase_.Id_ {
-				isOk = true
-				break
-			}
-		}
-		if !isOk {
-			return fmt.Sprintf("Невзаимная ссылка\nid=%q,dst=(%q)", sf.ElemBase_.Id_, actor.Id())
-		}
-	case cons.TypeUseLink:
-		link, isOk := dst.(types.IElemLinker)
-		if !isOk {
-			return fmt.Sprintf("Недопустимый тип получателя(%q)\nтип=%q\n", dst.Id(), dst.Type())
-		}
-		isOk = sf.ElemBase_.Id_ == link.DstId() || sf.ElemBase_.Id_ == link.SrcId()
-		if !isOk {
-			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, link.Id())
-		}
-	case cons.TypeUseCase:
-		useCase, isOk := dst.(types.IElemUseCase)
-		if !isOk {
-			return fmt.Sprintf("id=%q, Недопустимый тип получателя(%q)\nтип=%q\n", sf.ElemBase_.Id_, dst.Id(), dst.Type())
-		}
-		isOk = false
-		for _, id := range useCase.Links() {
-			if id == sf.ElemBase_.Id_ {
-				isOk = true
-				break
-			}
-		}
-		if !isOk {
-			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, useCase.Id())
-		}
-	default: // Недопустимый источник
-		return fmt.Sprintf("id=%q, Недопустимый тип получателя(%q)\nid=%q\n", sf.ElemBase_.Id_, dst.Type(), dst.Id())
-	}
-	return ""
-}
-
-// Проверяет связь источника
-func (sf *UseLink) checkSrc(mapDrawer map[alias.Id]types.IDrawer) string {
-	if sf.Src_ == "" {
-		return "ВНИМАНИЕ! Источник связи не задан(src)\n"
-	}
-	src, isOk := mapDrawer[sf.Src_]
-	if !isOk {
-		return "Отсутствует источник(src)\n"
-	}
-	switch src.Type() {
-	case cons.TypeUseActor:
-		isOk = false
-		actor := types.IActor(src)
-		for _, id := range actor.Links() { // Проверка на взаимность
-			if id == sf.ElemBase_.Id_ {
-				isOk = true
-				break
-			}
-		}
-		if !isOk {
-			return fmt.Sprintf("Невзаимная ссылка с актором %q\n", actor.Id())
-		}
-	case cons.TypeUseLink:
-		link, isOk := src.(types.IElemLinker)
-		if !isOk {
-			return fmt.Sprintf("Несоответствие типа источника(%q)\nтип='useLink'\n", src.Id())
-		}
-		isOk = sf.ElemBase_.Id_ == link.DstId() || sf.ElemBase_.Id_ == link.SrcId()
-		if !isOk {
-			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, link.Id())
-		}
-	case cons.TypeUseCase:
-		useCase, isOk := src.(types.IElemUseCase)
-		if !isOk {
-			return fmt.Sprintf("id=%q, Тип источника(%q) не совпадает с фактическим\nтип='useCase'\n", sf.ElemBase_.Id_, src.Id())
-		}
-		isOk = false
-		for _, id := range useCase.Links() { // Проверка на взаимность
-			if id == sf.ElemBase_.Id_ {
-				isOk = true
-				break
-			}
-		}
-		if !isOk {
-			return fmt.Sprintf("id=%q, Невзаимная ссылка(%q)\n", sf.ElemBase_.Id_, useCase.Id())
-		}
-	default: // Неизвестный источник
-		return fmt.Sprintf("id=%q, неизвестный тип источника(%q)<br>id=%q\n", sf.ElemBase_.Id_, src.Type(), src.Id())
-	}
-	return ""
-}
-
-// SrcId -- возвращает источник связи
-func (sf *UseLink) SrcId() alias.Id {
-	return sf.Src_
-}
-
-// DstId -- возвращает получателя связи
-func (sf *UseLink) DstId() alias.Id {
-	return sf.Dst_
-}

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

@@ -5,16 +5,16 @@ import (
 	"log"
 
 	svg "github.com/ajstarks/svgo"
+	"gitp78su.ipnodns.ru/svi/kern/v3"
 
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/goarch/lev0/types"
-	"gitp78su.ipnodns.ru/svi/goarch/pkg/elems/actor"
-	"gitp78su.ipnodns.ru/svi/kern/v3"
+	"gitp78su.ipnodns.ru/svi/goarch/lev1/elem_actor"
 )
 
 // ViewActor -- SVG-фигура актора
 type ViewActor struct {
-	Actor_ *actor.Actor
+	Actor_ *elem_actor.Actor
 }
 
 var (
@@ -22,7 +22,7 @@ var (
 )
 
 // NewViewActor -- возвращает новый SVG-актор
-func NewViewActor(actor *actor.Actor, elem map[string]interface{}) *ViewActor {
+func NewViewActor(actor *elem_actor.Actor, elem map[string]interface{}) *ViewActor {
 	hassert(actor != nil, "in NewViewActor(), actor is nil")
 	sf := &ViewActor{
 		Actor_: actor,