00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "TFItem.h"
00022 #include <iostream>
00023 #include <algorithm>
00024
00025 using namespace std;
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 TFItem::TFItem(QCanvas *canvas, TFEltSP elt)
00037 : PolygonEdit(canvas), _elt(elt), _axisX(0), _axisY(1), _lastEltMod(0), _lastElmMod(0),
00038 _done(false), _scale(canvas->width(), canvas->height()), _border(STF::tfSType(5.0))
00039 {
00040
00041 if(_elt.isNull())
00042 {
00043 cerr << "TFItem::construct(), ERROR tf element is NULL" << endl;
00044 }
00045 else
00046 {
00047
00048 _lastEltMod = _elt.getChangeID();
00049 _lastElmMod = _elt->getChangeID();
00050 }
00051 setTransform();
00052 }
00053
00054
00055
00056 void TFItem::update()
00057 {
00058 cerr << " update called " << endl;
00059 setTransform();
00060 updateDef();
00061 _lastEltMod = _elt.getChangeID();
00062 if(!_elt.isNull())
00063 {
00064 _lastElmMod = _elt->getChangeID();
00065 }
00066 }
00067
00068
00069
00070 tfVec2 TFItem::getTFPosCA(int i)
00071 {
00072
00073 TFElement *tfe = _elt.getPtr();
00074
00075 if((!tfe) || (i >= int(tfe->getPosVec().size()) ))
00076 return tfVec2_bad;
00077
00078
00079 TFElement::PosType p = tfe->getPos(i);
00080
00081 return tfVec2(p[_axisX], p[_axisY]);
00082 }
00083
00084
00085
00086 void TFItem::setTFPosCA(int i, tfVec2 pos)
00087 {
00088
00089 TFElement *tfe = _elt.getPtr();
00090
00091 if((!tfe) || (i >= int(tfe->getPosVec().size()) ))
00092 return;
00093
00094 TFElement::PosType p = tfe->getPos(i);
00095 p[_axisX] = pos.x;
00096 p[_axisY] = pos.y;
00097 tfe->setPos(i,p);
00098 }
00099
00100
00101
00102 void TFItem::setScale(tfVec2 scales)
00103 {
00104 _scale = scales;
00105 _invScale.x = 1.0/_scale.x;
00106 _invScale.y = 1.0/_scale.y;
00107 setTransform();
00108 }
00109
00110
00111
00112 void TFItem::setTransform()
00113 {
00114
00115 _xform.eye();
00116 _invXform.eye();
00117 tfVec2 scale(_scale - _border*2.0);
00118
00119 _xform[0] *= _scale.x;
00120 _xform[4] *= _scale.x;
00121 _xform[6] += _border.x;
00122 _xform[7] += _border.y;
00123
00124
00125
00126 _invXform = _xform.inv().tp();
00127
00128 }
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 TFItemVec::TFItemVec(QCanvas *canvas, TFBaseSP tf)
00139 : _tf(tf), _canvas(canvas), _scales(canvas->width(), canvas->height()),
00140 _border(STF::tfSType(5))
00141 {
00142 setTF(tf);
00143 }
00144
00145
00146
00147 TFItemVec::~TFItemVec()
00148 {
00149 clear();
00150 }
00151
00152
00153
00154 void TFItemVec::update()
00155 {
00156 if(_tf.isNull()) return;
00157 checkNewElts();
00158 checkDelElts();
00159
00160
00161 for(int i=0; i< int(size()); ++i)
00162 {
00163 TFItemSP item = this->operator[](i);
00164 item->setScale(_scales);
00165 item->setBorder(_border);
00166 item->update();
00167 }
00168 }
00169
00170
00171
00172 TFItemSP TFItemVec::getItem(TFEltSP elt) const
00173 {
00174 for(TFItemVecConstIter i = begin(); i != end(); ++i)
00175 {
00176 (*i)->getElt() == elt;
00177 return (*i);
00178 }
00179 return TFItemSP(0);
00180 }
00181
00182
00183
00184 void TFItemVec::addItem(TFEltSP elt)
00185 {
00186
00187 if(getItem(elt).isNull())
00188 {
00189
00190 TFItemSP item(genTFItem(elt, _canvas));
00191
00192 if(item.isNull())
00193 {
00194 cerr << "TFItemVec::addItem, cannot generate correct item" << endl;
00195 return;
00196 }
00197 push_back(item);
00198 }
00199 }
00200
00201
00202
00203 void TFItemVec::checkNewElts()
00204 {
00205 TFElementListSP tfel = _tf->getTFElts();
00206 for(TFElementListIter i = tfel->begin(); i != tfel->end(); ++i)
00207 {
00208 addItem((*i));
00209 }
00210 }
00211
00212
00213
00214 void TFItemVec::checkDelElts()
00215 {
00216 #if 0
00217 TFElementListSP tfel = _tf->getTFElts();
00218 for(TFElementListIter i = tfel->begin(); i != tfel->end(); ++i)
00219 {
00220 if( (*i)->needRemove() )
00221 {
00222 TFItemVecIter deliter = find(begin(), end(), getItem(*i));
00223 if(deliter != end())
00224 {
00225 erase( deliter );
00226 }
00227 else
00228 {
00229 cerr << "TFItemVec::checkDelElts(), element not found in vector" << endl;
00230 }
00231 }
00232 }
00233 #endif
00234 }
00235
00236
00237
00238 void TFItemVec::setTF(TFBaseSP tf)
00239 {
00240 _tf = tf;
00241
00242 clear();
00243
00244 update();
00245 }
00246
00247
00248
00249 void TFItemVec::setCanvas(QCanvas *canvas)
00250 {
00251 for(int i=0; i< int(size()); ++i)
00252 {
00253 this->operator[](i)->setCanvas(canvas);
00254 }
00255 _canvas = canvas;
00256 }
00257