def refineknotvector(self, XI, knotvec_choice): """Insert the knots contained in XI into U or V""" XI = np.asarray(XI, np.float).reshape(-1, ) if knotvec_choice == 'U': if np.min(XI) <= np.min(self.U): raise "Knots cannot be inserted: some elements too small" if np.max(XI) >= np.max(self.U): raise "Knots cannot be inserted: some elements too large" if np.any([ np.equal(xi, self.U).sum() + np.equal(xi, XI).sum() > self.p for xi in np.unique(XI) ]): raise "Knots cannot be inserted: some multiplicities too large" self.U, self.V, self.Pw = NURBSinC.RefineKnotVectSurface( self.n, self.p, self.U, self.m, self.q, self.V, self.Pw, XI, 0) self.r = self.U.shape[0] - 1 self.n = self.r - self.p - 1 self.pspans = np.unique(self.U) if knotvec_choice == 'V': if np.min(XI) <= np.min(self.V): raise "Knots cannot be inserted: some elements too small" if np.max(XI) >= np.max(self.V): raise "Knots cannot be inserted: some elements too large" if np.any([ np.equal(xi, self.V).sum() + np.equal(xi, XI).sum() > self.q for xi in np.unique(XI) ]): raise "Knots cannot be inserted: some multiplicities too large" self.V, self.U, self.Pw = NURBSinC.RefineKnotVectSurface( self.m, self.q, self.V, self.n, self.p, self.U, np.transpose(self.Pw, (1, 0, 2)), XI, 0) self.Pw = np.transpose(self.Pw, (1, 0, 2)) self.s = self.V.shape[0] - 1 self.m = self.s - self.q - 1 self.qspans = np.unique(self.V) self.P = (self.Pw[:, :, :3].T / self.Pw[:, :, 3].T).T self.w = self.Pw[:, :, 3]