void CommandTransform::undo() { for (QSet<int>::ConstIterator it = selection_.constBegin(); it != selection_.constEnd(); ++it) { if (model_->elements()[*it]->get_type() == ldraw::type_ref) CAST_AS_REF(model_->elements()[*it])->set_matrix(oldmatrices_[*it]); } }
void CommandTransform::redo() { for (QSet<int>::ConstIterator it = selection_.constBegin(); it != selection_.constEnd(); ++it) { if (model_->elements()[*it]->get_type() == ldraw::type_ref) { ldraw::element_ref *r = CAST_AS_REF(model_->elements()[*it]); ldraw::matrix cmat; if (inverse_) cmat = matrix_ * r->get_matrix(); else cmat = r->get_matrix() * matrix_; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { float e = cmat.value(i, j); if (std::fabs(std::fabs(e) - 1.0f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 1.0f:-1.0f; else if (std::fabs(e) < LDR_EPSILON) cmat.value(i, j) = 0.0f; else if (std::fabs(std::fabs(e) - 0.707106f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 0.707106f:-0.707106f; else if (std::fabs(std::fabs(e) - 0.5f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 0.5f:-0.5f; else if (std::fabs(std::fabs(e) - 0.866025f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 0.866025f:-0.866025f; } } r->set_matrix(cmat); } } }
void part_library::unlink(model_multipart *m) { for (int i = 0; i < m->main_model()->size(); ++i) { if (m->main_model()->at(i)->get_type() == type_ref) unlink_element(CAST_AS_REF(m->main_model()->at(i))); } std::map<std::string, model*> &list = m->submodel_list(); for (std::map<std::string, model*>::iterator it = list.begin(); it != list.end(); ++it) { model *tm = (*it).second; for (int i = 0; i < tm->size(); ++i) { if (tm->at(i)->get_type() == type_ref) unlink_element(CAST_AS_REF(tm->at(i))); } } }
void part_library::link_model(model *m) { for (int i = 0; i < m->size(); ++i) { if (m->at(i)->get_type() == type_ref) { element_ref *r = CAST_AS_REF(m->at(i)); if (link_element(r)) { if(r->get_model()) link_model(r->get_model()); } } } }
void CommandRemove::undo() { for (QMap<int, std::string>::Iterator it = objects_.begin(); it != objects_.end(); ++it) { ldraw::element_base *elem = ldraw::reader::parse_line(*it, model_); model_->insert_element(elem, it.key()); if (elem->get_type() == ldraw::type_ref) { ldraw::element_ref *ref = CAST_AS_REF(elem); if (!ref->get_model()) Application::self()->library()->link_element(ref); } } }
void CommandTransform::redo() { for (QSet<int>::ConstIterator it = selection_.constBegin(); it != selection_.constEnd(); ++it) { if (model_->elements()[*it]->get_type() == ldraw::type_ref) { ldraw::element_ref *r = CAST_AS_REF(model_->elements()[*it]); ldraw::matrix cmat; if (!r->get_model()) continue; if (pivot_ != Editor::PivotEach) { ldraw::matrix pretrans, posttrans; pretrans.set_translation_vector(pivotpoint_); posttrans.set_translation_vector(-pivotpoint_); cmat = pretrans * premult_ * postmult_ * posttrans * r->get_matrix(); } else { cmat = premult_ * r->get_matrix() * postmult_; } for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { float e = cmat.value(i, j); if (std::fabs(std::fabs(e) - 1.0f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 1.0f:-1.0f; else if (std::fabs(e) < LDR_EPSILON) cmat.value(i, j) = 0.0f; else if (std::fabs(std::fabs(e) - 0.707106f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 0.707106f:-0.707106f; else if (std::fabs(std::fabs(e) - 0.5f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 0.5f:-0.5f; else if (std::fabs(std::fabs(e) - 0.866025f) < LDR_EPSILON) cmat.value(i, j) = e > 0.0f ? 0.866025f:-0.866025f; } } for (int i = 0; i < 3; ++i) { float v = cmat.value(i, 3); float fmod = std::fmod(v, 1.0f); if (std::fabs(fmod) < LDR_EPSILON) { if (fmod < 0.0f) cmat.value(i, 3) = std::ceil(v); else cmat.value(i, 3) = std::floor(v); } } r->set_matrix(cmat); } } }