| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- include("scripts/EAction.js");
- include("scripts/library.js");
- function TextAlignedLeader(guiAction) {
- EAction.call(this, guiAction);
- this.doc = undefined;
- this.di = undefined;
- this.op = undefined;
- this.firstVertex = undefined;
- this.entityId = undefined;
- };
- TextAlignedLeader.prototype = new EAction();
- TextAlignedLeader.State = {
- SettingFirstVertex: 0,
- ChoosingEntity: 1
- };
- // Handler for event beginEvent
- TextAlignedLeader.prototype.beginEvent = function () {
- EAction.prototype.beginEvent.call(this);
- this.doc = this.getDocument();
- this.di = this.getDocumentInterface();
- this.op = new RAddObjectsOperation();
- this.setState(TextAlignedLeader.State.SettingFirstVertex);
- };
- // Setter for peoperty State
- TextAlignedLeader.prototype.setState = function (state) {
- EAction.prototype.setState.call(this, state);
- this.setCrosshairCursor();
- var appWin = RMainWindowQt.getMainWindow();
- switch (this.state) {
- case TextAlignedLeader.State.SettingFirstVertex:
- this.getDocumentInterface().setClickMode(RAction.PickCoordinate);
- var trFirstVertex = qsTr("Arrow position");
- this.setCommandPrompt(trFirstVertex);
- this.setLeftMouseTip(trFirstVertex);
- this.setRightMouseTip(EAction.trCancel);
- EAction.showSnapTools();
- break;
- case TextAlignedLeader.State.ChoosingEntity:
- this.getDocumentInterface().setClickMode(RAction.PickEntity);
- var trSelectText = qsTr("Choose text");
- this.setCommandPrompt(trSelectText);
- this.setLeftMouseTip(trSelectText);
- this.setRightMouseTip(EAction.trCancel);
- break;
- };
- };
- // Handler for event pickCoordinate
- TextAlignedLeader.prototype.pickCoordinate = function (event, preview) {
- switch (this.state) {
- case TextAlignedLeader.State.SettingFirstVertex:
- if (!preview) {
- this.firstVertex = event.getModelPosition();
- if (!isNull(this.firstVertex)) {
- this.setState(TextAlignedLeader.State.ChoosingEntity);
- }
- }
- break;
- };
- };
- // Handler for event pickEntity
- TextAlignedLeader.prototype.pickEntity = function (event, preview) {
- this.entityId = this.getEntityId(event, preview);
- var pos = event.getModelPosition();
- switch (this.state) {
- case TextAlignedLeader.State.ChoosingEntity:
- if (preview) {
- this.updatePreview();
- }
- else {
- this.drawLeader(this.entityId);
- }
- break;
- };
- };
- TextAlignedLeader.prototype.getHighlightedEntities = function() {
- var ret = [];
- if (isEntity(this.doc.queryEntity(this.entityId)) && this.verifyEntity() == "ОК") {
- ret.push(this.entityId);
- }
- return ret;
- };
- TextAlignedLeader.prototype.verifyEntity = function () {
- if (this.entityId != -1 && isTextEntity(this.doc.queryEntity(this.entityId))) {
- return "ОК";
- }
- return "Choose text";
- };
- TextAlignedLeader.prototype.setLeftLeader = function (leader, vectorArr) {
- leader.appendVertex(this.firstVertex);
- leader.appendVertex(vectorArr[0]);
- leader.appendVertex(vectorArr[1]);
- return leader;
- };
- TextAlignedLeader.prototype.setRightLeader = function (leader, vectorArr) {
- leader.appendVertex(this.firstVertex);
- leader.appendVertex(vectorArr[1]);
- leader.appendVertex(vectorArr[0]);
- return leader;
- };
- TextAlignedLeader.prototype.drawLeader = function (entityId) {
- // checking the validity of an entity
- var msg = this.verifyEntity();
- if (msg != "ОК") {
- EAction.handleUserWarning(qsTr(msg));
- return;
- };
- var entity = this.doc.queryEntity(entityId);
- var td = entity.getData();
- // get the enlarged bounding box (10% of the text height)
- var box = td.getBoundingBox().grow(entity.getTextHeight() * 0.1);
- var vectorArr = box.getCorners2d();
- // delete 2 top corners
- vectorArr.pop();
- vectorArr.pop();
- // find the index of the point closest to the firstVertex
- var index = this.firstVertex.getClosestIndex2D(vectorArr);
- // choose the right or left leader depending on the firstVertex
- var leader = new RLeaderEntity(this.doc, new RLeaderData());
- if (index == 0) {
- this.op.addObject(this.setLeftLeader(leader, vectorArr));
- } else {
- this.op.addObject(this.setRightLeader(leader, vectorArr));
- }
- this.di.applyOperation(this.op);
- EAction.handleUserMessage(qsTr("Leader was created successfully"));
- this.terminate();
- };
|