forked from enviPath/enviPy
113 lines
3.7 KiB
JavaScript
113 lines
3.7 KiB
JavaScript
/****************************************************************************
|
|
* Copyright 2017 EPAM Systems
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
***************************************************************************/
|
|
|
|
var Box2Abs = require('../../util/box2abs');
|
|
var Vec2 = require('../../util/vec2');
|
|
var ReObject = require('./reobject');
|
|
var scale = require('../../util/scale');
|
|
|
|
function ReFrag(/* Struct.Fragment = {}*/frag) {
|
|
this.init('frag');
|
|
|
|
this.item = frag;
|
|
}
|
|
ReFrag.prototype = new ReObject();
|
|
ReFrag.isSelectable = function () {
|
|
return false;
|
|
};
|
|
|
|
ReFrag.prototype.fragGetAtoms = function (render, fid) {
|
|
var ret = [];
|
|
render.ctab.atoms.each(function (aid, atom) {
|
|
if (atom.a.fragment == fid)
|
|
ret.push(aid);
|
|
}, this);
|
|
return ret;
|
|
};
|
|
|
|
ReFrag.prototype.fragGetBonds = function (render, fid) {
|
|
var ret = [];
|
|
render.ctab.bonds.each(function (bid, bond) {
|
|
if (render.ctab.atoms.get(bond.b.begin).a.fragment == fid &&
|
|
render.ctab.atoms.get(bond.b.end).a.fragment == fid)
|
|
ret.push(bid);
|
|
}, this);
|
|
return ret;
|
|
};
|
|
|
|
ReFrag.prototype.calcBBox = function (restruct, fid, render) { // TODO need to review parameter list
|
|
var ret;
|
|
restruct.atoms.each(function (aid, atom) {
|
|
if (atom.a.fragment == fid) {
|
|
// TODO ReObject.calcBBox to be used instead
|
|
var bba = atom.visel.boundingBox;
|
|
if (!bba) {
|
|
bba = new Box2Abs(atom.a.pp, atom.a.pp);
|
|
var ext = new Vec2(0.05 * 3, 0.05 * 3);
|
|
bba = bba.extend(ext, ext);
|
|
} else {
|
|
if (!render) {
|
|
console.warn('No boundingBox fragment precalc');
|
|
render = global._ui_editor.render; // eslint-disable-line
|
|
}
|
|
|
|
bba = bba.translate((render.options.offset || new Vec2()).negated()).transform(scale.scaled2obj, render.options);
|
|
}
|
|
ret = (ret ? Box2Abs.union(ret, bba) : bba);
|
|
}
|
|
});
|
|
return ret;
|
|
};
|
|
|
|
// TODO need to review parameter list
|
|
ReFrag.prototype._draw = function (render, fid, attrs) { // eslint-disable-line no-underscore-dangle
|
|
var bb = this.calcBBox(render.ctab, fid, render);
|
|
if (bb) {
|
|
var p0 = scale.obj2scaled(new Vec2(bb.p0.x, bb.p0.y), render.options);
|
|
var p1 = scale.obj2scaled(new Vec2(bb.p1.x, bb.p1.y), render.options);
|
|
return render.paper.rect(p0.x, p0.y, p1.x - p0.x, p1.y - p0.y, 0).attr(attrs);
|
|
} else { // eslint-disable-line no-else-return
|
|
// TODO abnormal situation, empty fragments must be destroyed by tools
|
|
console.assert(null, 'Empty fragment');
|
|
}
|
|
};
|
|
|
|
ReFrag.prototype.draw = function (render) { // eslint-disable-line no-unused-vars
|
|
return null;// this._draw(render, fid, { 'stroke' : 'lightgray' }); // [RB] for debugging only
|
|
};
|
|
|
|
ReFrag.prototype.drawHighlight = function (render) { // eslint-disable-line no-unused-vars
|
|
// Do nothing. This method shouldn't actually be called.
|
|
};
|
|
|
|
ReFrag.prototype.setHighlight = function (highLight, render) {
|
|
var fid = render.ctab.frags.keyOf(this);
|
|
if (!(typeof fid === "undefined")) {
|
|
render.ctab.atoms.each(function (aid, atom) {
|
|
if (atom.a.fragment == fid)
|
|
atom.setHighlight(highLight, render);
|
|
}, this);
|
|
render.ctab.bonds.each(function (bid, bond) {
|
|
if (render.ctab.atoms.get(bond.b.begin).a.fragment == fid)
|
|
bond.setHighlight(highLight, render);
|
|
}, this);
|
|
} else {
|
|
// TODO abnormal situation, fragment does not belong to the render
|
|
}
|
|
};
|
|
|
|
module.exports = ReFrag;
|