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);
		}
	}
}
示例#3
0
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)));
		}
	}
}
示例#4
0
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());
			}
		}
	}
}
示例#5
0
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);
		}
	}
}